2016-05-16 125 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

相关问题