小编Dan*_*Dan的帖子

ContinueWhenAll不等待所有任务完成

我在网上找到了一段代码并对其进行了一些修改以了解它是如何工作的,但现在我遇到了问题,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不等待计算所有结果并且程序结束就像程序中没有那行代码(几毫秒之后)?

c# parallel-processing task

7
推荐指数
1
解决办法
1万
查看次数

标签 统计

c# ×1

parallel-processing ×1

task ×1