2016-05-16 122 views
1

以下代碼永不返回。調試顯示,即使隊列爲空,queue.IsCompleted也會返回false。我錯過了什麼嗎?即使隊列爲空,queue.IsCompleted也會返回false?

var workers = new Task[1]; 
using (var queue = new BlockingCollection<QueuePayload>(20)) 
{ 
    workers[0] = Task.Run(() => Consume(queue)); 
    queue.Add(new QueuePayload{....}); 
    Task.WaitAll(workers); 
} 

void Consume(BlockingCollection<QueuePayload> queue)) 
{ 
    while (!queue.IsCompleted) 
    { 
     var i = new QueuePayload(); 
     try 
     { 
      i = queue.Take(); 
     } 
     catch (InvalidOperationException) 
     { 
      break; 
     } 
    ...... 
+0

而不是'while(!queue.IsCompleted){i = queue.Take(); ...'我發現只要執行'foreach(var我在queue.GetConsumingEnumerable()){...' –

+0

所以如果在最後一個'queue.Add後添加'queue.CompleteAdding()' (新的QueuePayload {.....})'它仍然表現如此? –

+0

我在MSDN中的例子。也許他們應該更新這些例子。 – ca9163d9

回答

3

IsCompleted酒店在https://msdn.microsoft.com/en-us/library/dd267315(v=vs.110).aspx有以下文字:

無論這個系列已被標記爲增加爲完整的並且是空的。

你在哪裏標記收藏已完成?這不是一個空檢查 - 它是一個帶有手動附加開關的空檢查。

有相應的CompleteAdding()方法,表示不會再添加項目。

+0

不知道是誰標記了這個問題,但如果問題是關於爲什麼當隊列爲空時爲什麼'IsCompleted'標誌沒有返回'true',它回答了這個問題。 –

1

完成將項目添加到集合後,請致電queue.CompleteAdding()queue.IsCompleted將返回true集合中沒有任何項目時(全部刪除之後)。如果您沒有撥打CompleteAdding(),則可能會添加更多項目,因此IsCompleted將始終返回false

相關問題