【发布时间】:2015-01-09 04:09:17
【问题描述】:
我有以下名为 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 中切换了一个断点并且永远不会被命中。
【问题讨论】:
-
Task.WhenAll不是阻塞方法。它返回一个您可以等待的任务。请改用Task.WaitAll。 -
在
SumAsync中使用async/await也没有任何意义。只需返回Task.Run创建的任务即可。 -
你一定有其他问题。 1+1 上的断点在我的机器上停止。我确实重新格式化了代码,在不同的行上有花括号(如上帝所愿)。
-
@SteveWellens 这是一个竞争条件,因为应用程序可以在这些任务安排之前结束。
-
@SteveWellens:任务在后台线程上运行,不会阻止进程退出。操作系统肯定将停止这些线程而不会引发错误;如果进程中的所有前台线程都退出,它们会在没有仪式的情况下简单地终止。这正是这里发生的事情。
标签: c# .net multithreading async-await