ContinueWhenAll不等待所有任务完成

Dan*_*Dan 7 c# parallel-processing task

我在网上找到了一段代码并对其进行了一些修改以了解它是如何工作的,但现在我遇到了问题,ContinueWhenAll因为它不等待所有任务完成:

List<Task> tasks = new List<Task>();
for (int i = 0; i < 20; i++)
{
    int j = i;
    var compute = Task.Factory.StartNew(() => results.Add(DoSomething(j)));
    tasks.Add(compute);
}
Run Code Online (Sandbox Code Playgroud)

我正在使用此代码将所有任务添加到列表中.DoSomething函数计算一些结果并将它们添加到BlockingCollection.我有另一个显示功能,它将所有添加的结果写入BlockingCollection控制台.

我已经使用此代码等待所有任务完成,但看起来它不会等待它们,因为程序"Press any key to continue"在启动后的几毫秒内显示标准消息.(程序完成需要~20秒)

Task.Factory.ContinueWhenAll(tasks.ToArray(), result => results.CompleteAdding());
Run Code Online (Sandbox Code Playgroud)

但是,如果我添加Task.WaitAll(consume)到程序结束,程序工作正常:

var consume = Task.Factory.StartNew(() => display(results));
//results = BlockingCollection that I mentioned 
Run Code Online (Sandbox Code Playgroud)

据我所知,该程序没有足够的时间显示所有结果,BlockingCollection但仍有足够的时间显示一些,同时等待所有任务完成.

有人可以解释我为什么Task.Factory.ContinueWhenAll不等待计算所有结果并且程序结束就像程序中没有那行代码(几毫秒之后)?

Jal*_*aid 15

Task.Factory.ContinueWhenAll不是阻止方法; 它实际上会启动一个只在所有提供的任务完成执行时才能运行的新任务.所以在程序启动后几毫秒看到一条消息是正常的,因为它不会阻塞你的主要等待任务完成.来自msdn:

创建一个继续任务,该任务将在完成一组提供的任务后启动.

Task.WaitAll阻止在调用者等待所提供的所有任务完成执行.

  • @Dan:它安排一个新任务,该任务将在第一组任务完成后运行.它不会导致调用`ContinueWhenAll`的线程中的任何等待.当该博客说它等待完成一系列任务时,它只意味着**新任务等待其他任务完成**.有时您应该尝试阅读[官方文档](http://msdn.microsoft.com/en-us/library/dd321473.aspx),其中说"创建一个将在完成一组完成后启动的继续任务提供任务.",而不是依赖博客. (4认同)