Task可以用来并行处理多个任务,使用线程池线程进行异步处理,配合 await async 可以非常好的完成异步任务,使用Task 可以很方便的利用线程池中的线程,比Thread 好用很多。
创建一个Task任务;
1.Run方法调用:
Task t1 = Task.Run(WriteCon);
2.StartNew方法调用:
Task t2 = Task.Factory.StartNew(WriteCon1);
3.Run方法传参调用:
Task t3 = Task.Run(() => WriteCon2("t3"));
4.委托形式任务调用:
Action<object> action = WriteCon2;
Task t4 = new Task(action, "t4");
5.Run方法带返回值调用:
Task<string> t5 = Task.Run(() => WriteCon3("123"));
在多个任务运行时,因为Task任务不使用await时并不等待调用线程(异步),所以我们可以使用Wait() 方法等待任务完成。
Task<string> t5 = Task.Run(() => WriteCon3("123"));
//等待t5任务执行完毕,然后在通过Result属性获取返回结果,避免死锁及同步等待。
t5.Wait();
string retStr = t5.Result;
也可以使用WaitAll() 等待多个任务执行完毕:
Task.WaitAll(t1, t2, t3);
注意:Wait和WaitAll 会阻塞调用线程,在异步方法中推荐使用 WhenAll 进行异步等待,释放调用线程。
await Task.WhenAll(t1, t2, t3);
完整参考代码:
class TaskDemo
{
public static void TaskDemoMain()
{
//Run方法调用
Task t1 = Task.Run(WriteCon);
//StartNew方法调用
Task t2 = Task.Factory.StartNew(WriteCon1);
//Run方法传参调用
Task t3 = Task.Run(() => WriteCon2("t3"));
//委托形式任务调用
Action<object> action = WriteCon2;
Task t4 = new Task(action, "t4");
//等待t1\t2\t3任务执行完毕
Task.WaitAll(t1, t2, t3);
t4.Start();//等待前面任务完成后t4任务启动
//Run方法带返回值调用
Task<string> t5 = Task.Run(() => WriteCon3("123"));
//等待t5任务执行完毕,然后在通过Result属性获取返回结果,避免死锁及同步等待。
t5.Wait();
string retStr = t5.Result;
Console.WriteLine(retStr);
//Run方法带返回值调用 并增加后续处理
Task<string> t6 = Task.Run(() => WriteCon3("123"))
.ContinueWith(t =>
{
string temp = t.Result;
return temp + "---这是t6任务";
});
//等待t5任务执行完毕,然后在通过Result属性获取返回结果,避免死锁及同步等待。
t6.Wait();
string retStr1 = t6.Result;
Console.WriteLine(retStr1);
}
private static void WriteCon()
{
Thread.Sleep(2000);
Console.WriteLine($"Task-{Task.CurrentId},线程-{Thread.CurrentThread.ManagedThreadId},WriteCon方法完成");
}
private static void WriteCon1()
{
Thread.Sleep(1000);
Console.WriteLine($"Task-{Task.CurrentId},线程-{Thread.CurrentThread.ManagedThreadId},WriteCon1方法完成");
}
private static void WriteCon2(object msg)
{
Console.WriteLine($"Task-{Task.CurrentId},线程-{Thread.CurrentThread.ManagedThreadId},WriteCon2方法完成,输出:" + msg);
}
private static string WriteCon3(string msg)
{
Console.WriteLine($"Task-{Task.CurrentId},线程-{Thread.CurrentThread.ManagedThreadId},WriteCon3方法完成,输出:" + msg);
return "WriteCon3方法完成,输出:" + msg;
}
}
输出结果: