ContinueWhenAll不会等待所有任务完成

ContinueWhenAll不会等待所有任务完成

问题描述:

我已经找到了代码在网络上的安宁,并修改了一下看它是如何工作的,但现在我有一个问题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); 
} 

我正在使用此代码将所有任务添加到列表中。 DoSomething函数计算了一定的成果,并将它们添加到BlockingCollection我从BlockingCollection写入所有添加的结果,另一个显示功能来安慰

我已经使用这个代码,以等待所有任务完成,但它看起来像它不等待他们作为程序显示标准“在程序启动后几毫秒内按任意键继续”消息。 (应采取〜20秒的程序来完成)

Task.Factory.ContinueWhenAll(tasks.ToArray(), result => results.CompleteAdding()); 

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

var consume = Task.Factory.StartNew(() => display(results)); 
//results = BlockingCollection that I mentioned 

据我了解,它计划将不会有足够的时间显示从BlockingCollection所有结果,但它仍然有更多的时间来显示一些,而等待所有的任务完成

有人可以解释我为什么Task.Factory.ContinueWhenAll不等待所有结果如程序中没有那行代码(在几毫秒之后)

Task.Factory.ContinueWhenAll不是阻塞方法;它实际上会启动一个新的任务,只有当所有提供的任务完成执行时才会起作用,所以在程序启动后几毫秒内看到一条消息是正常的,因为它不会在您主要等待的任务完成。 从msdn

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

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

+0

“完成一组提供的任务”这正是我所说的,它不应该创建新的任务,直到列表中的所有任务完成其工作。这里唯一令人困惑的事情是程序是否在等待“在该线上”或程序是否转到下一行并在完成所有任务后启动新任务? – Dan

+0

@Dan:当“ContinueWhenAll”时,程序将不会“等待该线路”,而是转到下一行,同时创建一个新的任务,直到提供的任务完成后才会起作用。但'WaitAll'将等待该行_“阻止”,直到所有提供的任务完成执行。 –

+0

似乎这不是真的,请看他的链接http://blogs.msdn.com/b/csharpfaq/archive/2010/06/18/parallel-programming-task-schedulers-and-synchronization-context .aspx?PageIndex = 2,你会发现一部分内容说我已经使用了等待一系列任务完成的ContinueWhenAll方法。 – Dan