簡體   English   中英

ContinueWhenAll 不會等待所有任務完成

[英]ContinueWhenAll doesn't wait for all task to complete

我在 web 上找到了一段代碼,並對其進行了一些修改以查看其工作原理,但現在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 function 計算一些結果並將它們添加到BlockingCollection 我有另一個顯示器 function 它將所有添加的結果從BlockingCollection寫入控制台。

我已使用此代碼等待所有任務完成,但看起來它並沒有等待它們,因為程序在啟動幾毫秒后顯示標准的"Press any key to continue"消息。 (程序完成大約需要 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不是阻塞方法; 它實際上會啟動一個新任務,當所有提供的任務都在那里執行時,它只會啟動 function,所以在程序啟動后幾毫秒看到一條消息是正常的,因為它不會阻塞在你的主等待任務完成。 來自msdn

創建一個將在完成一組提供的任務后啟動的延續任務。

Task.WaitAll將在調用者處阻塞,等待所有提供的任務完成執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM