Task 在C#中表示一个异步操作。
作为一个方法的返回类型时通常与async同时出现;而async又与await正好是一对。
Task 实例可以用各种不同的方式创建。 最常见的方法是使用任务的 Factory 属性检索可用来创建用于多个用途的TaskFactory实例。 例如,要创建运行操作的 Task,可以使用工厂的StartNew方法:Task.Factory.StartNew(Action) ;.net 4.5又添加了Task.Run(Action) 想了解更多 请猛戳 这里 有更多示例代码。
通常通过上面两个方法实例的Task已经开始运行,但是它不一定是新起一个线程,而是去查找闲置线程并在此闲置的线程上去运行。
static async Task T2() { var t1 = T1(); var t2 = Task.Run(delegate { for (int i = 1111; i < 2000; i++) { Console.WriteLine(i); } }); await t1; await t2; } static async Task T1() { await Task.Run(delegate { for (int i = 0; i < 1000; i++) { Console.WriteLine(i); } }); }
如上代码,当我们直接调用T2方法的时候 运行到var t1=T1();时已经将T1里面的任务加入到执行队列中去;可能不会马上执行,因为它还要去寻找闲置的线程。
运行到var t2=Task....(省略)时同样只是将其中的任务加入到执行队列中去,它们的任务可能是放在不同的线程中去运行的。然后再通过await去等待确定它们都执行完成。
都完成后再回到主线程(主线程只是指T2方法执行的线程)中来;
下面其实跟Task就没有直接关系了
图片中的提示可以看出,一个异步方法 在await Task 之前其实仍然是在进行同步运行的(可能不是很明显,但是我写过测试确实如此);只有在遇到了await Task的时候再将运行的任务异步操作。
小结
我最讨厌小结、总结什么的了。
时间: 2024-10-19 21:00:35