我开始学习C#5.0中的异步/等待,但我一点也不了解。我不明白如何将其用于并行性。我尝试了以下非常基本的程序:
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Task task1 = Task1(); Task task2 = Task2(); Task.WaitAll(task1, task2); Debug.WriteLine("Finished main method"); } public static async Task Task1() { await new Task(() => Thread.Sleep(TimeSpan.FromSeconds(5))); Debug.WriteLine("Finished Task1"); } public static async Task Task2() { await new Task(() => Thread.Sleep(TimeSpan.FromSeconds(10))); Debug.WriteLine("Finished Task2"); } } }
该程序只是阻止调用,Task.WaitAll()并且永远不会结束,但是我不明白为什么。我敢肯定,我只是缺少一些简单的东西,或者只是没有正确的思维模式,而且没有任何博客或MSDN文章对您有所帮助。
Task.WaitAll()
我建议你开始跟我介绍到async/await和后续使用上TAP官方MSDN文档。
async
await
正如我在介绍性博客文章中提到的那样,有几个Task成员是TPL的保留成员,并且没有使用纯async代码。new Task并Task.Start应替换为Task.Run(或TaskFactory.StartNew)。同样,Thread.Sleep应替换为Task.Delay。
Task
new Task
Task.Start
Task.Run
TaskFactory.StartNew
Thread.Sleep
Task.Delay
最后,我建议您不要使用Task.WaitAll; 您的控制台应用程序应该只是Wait在一个单一Task其用途Task.WhenAll。经过所有这些更改,您的代码将如下所示:
Task.WaitAll
Wait
Task.WhenAll
class Program { static void Main(string[] args) { MainAsync().Wait(); } public static async Task MainAsync() { Task task1 = Task1(); Task task2 = Task2(); await Task.WhenAll(task1, task2); Debug.WriteLine("Finished main method"); } public static async Task Task1() { await Task.Delay(5000); Debug.WriteLine("Finished Task1"); } public static async Task Task2() { await Task.Delay(10000); Debug.WriteLine("Finished Task2"); } }