1. 无返回值
方法1
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Start:" + DateTime.Now);
Task task = new Task(() => Test());
task.Start();
Task task1 = new Task(() => Test1());
task1.Start();
Console.ReadKey();
}
public static void Test()
{
Thread.Sleep(2000);
Console.WriteLine("Test:" + DateTime.Now);
}
public static void Test1()
{
Thread.Sleep(2000);
Console.WriteLine("Test1:" + DateTime.Now);
}
}
运行结果

———————————————————————————————————————
方法2
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Start:" + DateTime.Now);
Task.Run(() => Test());
Task.Run(() => {
Test1();
});
Console.ReadKey();
}
public static void Test()
{
Thread.Sleep(2000);
Console.WriteLine("Test:" + DateTime.Now);
}
public static void Test1()
{
Thread.Sleep(2000);
Console.WriteLine("Test1:" + DateTime.Now);
}
}
运行结果

———————————————————————————————————————
方式3
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Start:" + DateTime.Now);
Task.Factory.StartNew(() => Test());
Task.Factory.StartNew(() =>
{
Test1();
});
Console.ReadKey();
}
public static void Test()
{
Thread.Sleep(2000);
Console.WriteLine("Test:" + DateTime.Now);
}
public static void Test1()
{
Thread.Sleep(2000);
Console.WriteLine("Test1:" + DateTime.Now);
}
}
运行结果

2. 有返回值用法
方法1
class Program
{
static void Main(string[] args)
{
Task<string> task = Task.Run(() => {
return "12345";
});
task.Wait();
Console.WriteLine(task.Result);
Console.ReadLine();
}
}
运行结果

方法2
class Program
{
static void Main(string[] args)
{
int n = Test2().Result;
Console.WriteLine(n);
Console.ReadKey();
}
public static async Task<int> Test()
{
return await Test2();
}
public static async Task<int> Test2()
{
var s = await Task.FromResult<int>(1234);
return s;
}
}
运行结果

3.ContinueWith 在某Task之后执行
class Program
{
static void Main(string[] args)
{
Task<string> task1 = Task<string>.Run(() =>
{
Task.Delay(10);
Console.WriteLine("This is task1");
return "This is task1 return";
});
Task task2 = Task.Run(() =>
{
Console.WriteLine("This is task2");
});
//Task task2 = task1.ContinueWith((t) =>
//{
// Console.WriteLine("This is task2");
// Console.WriteLine(t.Result);
//});
task1.Wait();
task2.Wait();
Console.ReadKey();
}
}
运行结果
不使用ContinueWith

使用ContinueWith

4. Task与 Async 和 await,如某方法内需要执行耗时操作并需要返回值,但不希望阻塞
class Program
{
static void Main(string[] args)
{
Task<int> sum = Test();
Console.WriteLine("Run complete!" + sum.Result);
Console.ReadKey();
}
private static async Task<int> Test()
{
int sum = await Task<int>.Run(() =>
{
return Cal();
});
return sum;
}
public static int Cal()
{
int sum = 0;
for (int i = 0; i < 1000; i++)
{
sum = sum + i;
Thread.Sleep(1);
}
return sum;
}
}
运行结果

5. Task回调
- 方法1,无参数
class Program
{
static void Main(string[] args)
{
Action a = new Action(() =>
{
Console.WriteLine("Action ");
});
Task.Factory.FromAsync(a.BeginInvoke(CallBack, null), a.EndInvoke);
Console.ReadKey();
}
private static void CallBack(IAsyncResult ar)
{
Console.WriteLine("CallBack ");
}
}
运行结果

方法2,有参数
static void Main(string[] args)
{
Action<string> a = new Action<string>((ss) => {
Console.WriteLine("Action " + ss);
});
Task.Factory.FromAsync(a.BeginInvoke("1234",CallBack, "5678"), a.EndInvoke);
Console.ReadKey();
}
private static void CallBack(IAsyncResult ar)
{
Console.WriteLine("CallBack " + ar.AsyncState);
}
}
运行结果

本文详细介绍了C#中Task的使用,包括无返回值的Task应用、有返回值的Task实现、ContinueWith的使用场景,以及如何结合Async和await进行非阻塞操作。还探讨了Task的回调功能,通过实例展示了无参数和带参数的方法应用。
835

被折叠的 条评论
为什么被折叠?



