我有以下类名为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
内切换断点并且永远不会被击中。
答案 0 :(得分:3)
Task.WhenAll(tasks)
是async
方法,因此返回Task
。您需要await
该任务,以确保仅在完成所有任务后继续。目前,您的应用程序可能会在这些任务有机会运行之前结束。
这导致使用Work
关键字标记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
和我的WorkAsync
中),则可以将其删除async
关键字,只需返回任务。 略微可提高性能。关于它的更多信息here。
注意:在非常特殊的情况下(例如在Wait
内),您应该仅阻止Main
的任务,因为它可能导致死锁。更好的解决方案是使用AsyncContext
。