以下代碼永不返回。調試顯示,即使隊列爲空,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;
}
......
而不是'while(!queue.IsCompleted){i = queue.Take(); ...'我發現只要執行'foreach(var我在queue.GetConsumingEnumerable()){...' –
所以如果在最後一個'queue.Add後添加'queue.CompleteAdding()' (新的QueuePayload {.....})'它仍然表現如此? –
我在MSDN中的例子。也許他們應該更新這些例子。 – ca9163d9