C# 当所有人都不';不要等待所有任务完成

C# 当所有人都不';不要等待所有任务完成,c#,parallel-processing,task,C#,Parallel Processing,Task,我在web上找到了一段代码,并对其进行了一些修改,以了解其工作原理,但现在我遇到了continuewhalll的问题,因为它不会等待所有任务完成: 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)));

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

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);
}
但是,如果我将
Task.WaitAll(consume)
添加到程序的末尾,程序运行良好:

var consume = Task.Factory.StartNew(() => display(results));
//results = BlockingCollection that I mentioned 
据我所知,程序将没有足够的时间显示来自
BlockingCollection
的所有结果,但在等待所有任务完成时,它仍然有足够的时间显示一些结果


有人能解释一下为什么Task.Factory.ContinueWhenAll不等待所有的结果被计算出来,程序结束,就像程序中没有那行代码一样(几毫秒后)?

Task.Factory.ContinueWhenAll
不是一种阻塞方法;实际上,它将启动一个新任务,该任务只有在所有提供的任务都完成执行后才能运行,因此在程序启动几毫秒后看到消息是正常的,因为它不会在主服务器上阻塞,等待任务完成。 发件人:


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


其中,
Task.WaitAll
将在调用者处阻塞,等待所有提供的任务完成执行。

“完成一组提供的任务后”这正是我所说的,在列表中的所有任务完成其工作之前,它不应创建新任务。这里唯一令人困惑的是程序是否“在那一行”等待或者程序转到下一行并在所有任务完成后启动新任务?@Dan:When
Continue When all
程序将不会
在该行等待,而是转到下一行,同时创建一个新任务,直到提供的任务完成后才能运行。但是,
WaitAll
将在该行“block”上等待,直到所有提供的任务在那里完成执行。看起来这实际上不是真的,看看他的链接,你会发现有一部分说我已经使用了ContinueWhenAll方法,它等待一系列任务完成problem@Dan:它计划在第一组任务完成后运行的新任务。它不会在调用
continuewhalll
的线程中导致任何等待。当该博客说它等待一系列任务完成时,它只意味着新任务等待其他任务完成。有时你应该尝试阅读,它说“创建一个延续任务,在完成一组提供的任务后开始”,而不是依赖博客。
var consume = Task.Factory.StartNew(() => display(results));
//results = BlockingCollection that I mentioned