我有以下课程,名为Pluck:
internal static void Work()
{
Task[] tasks = new Task[5];
for (int i = 0; i < tasks.Length; i++)
{
tasks[i] = SumAsync();
}
Task.WhenAll(tasks);
}
private static async Task<int> SumAsync()
{
return await Task.Run(() => { return OnePlusOne(); });
}
private static int OnePlusOne()
{ return 1+1; }我的主要方法是:
static void Main(string[] args)
{
Pluck.Work();
}我遗漏了一些东西,因为我在OnePlusOne中切换了一个断点,并且从未被击中。
发布于 2015-01-08 17:13:15
Task.WhenAll(tasks)是一个async方法,因此返回一个Task。您需要对该任务进行await,以确保只在完成所有任务之后才继续执行。目前,您的应用程序可能会在这些任务有机会运行之前结束。
这导致用async关键字标记async,并让它返回Task本身:
internal static async Task WorkAsync()
{
Task[] tasks = new Task[5];
for (int i = 0; i < tasks.Length; i++)
{
tasks[i] = SumAsync();
}
await Task.WhenAll(tasks);
}由于不能在await中使用Main,所以需要与Wait同步等待
static void Main(string[] args)
{
Pluck.WorkAsync().Wait();
}在单个await是在方法中所做的最后一件事的情况下(就像在SumAsync和my WorkAsync中一样),您可以删除它和async关键字,然后直接返回任务。这个稍微提高了的性能。更多关于它的here。
注意:在非常特殊的情况下(比如在Wait中),您只应该阻止使用Main的任务,因为它会导致死锁。更好的解决方案是使用AsyncContext。
https://stackoverflow.com/questions/27845604
复制相似问题