以下代码永不返回。调试显示,即使队列为空,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