开始学习C#5.0的async/await,完全不懂。我不明白它如何用于并行性。我尝试了以下非常基本的程序:
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 文章都没有帮助。
最佳答案
我建议您从我的 intro to async
/await
开始并跟进 official Microsoft documentation on TAP .
正如我在介绍性博客文章中提到的,有几个 Task
成员是 TPL 的遗留物,在纯 async
代码中没有用处。 new Task
和 Task.Start
应替换为 Task.Run
(或 TaskFactory.StartNew
)。同样,Thread.Sleep
应替换为 Task.Delay
。
最后,我建议你不要使用Task.WaitAll
;您的控制台应用程序应该只在使用 Task.WhenAll
的单个 Task
上Wait
。通过所有这些更改,您的代码将如下所示:
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");
}
}
关于c# - 了解 C# 中的异步/等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14177891/