queue.IsCompleted returns false 即使队列为空?

queue.IsCompleted returns false even when the queue is empty?

以下代码永远不会return。调试显示即使队列为空,queue.IsCompleted return 也是错误的。我错过了什么吗?

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;
        }
    ......

IsCompletedhttps://msdn.microsoft.com/en-us/library/dd267315(v=vs.110).aspx 的 属性 具有以下文本:

Whether this collection has been marked as complete for adding and is empty.

您在哪里将 collection 标记为已完成?这不是空头支票 - 它是带有手动附加开关的空头支票。

因此有一个 CompleteAdding() 方法来标记不再添加项目。

将项目添加到集合后,请致电 queue.CompleteAdding()。这样 queue.IsCompleted 将 return true 当集合中没有项目时(在您将它们全部删除之后。)如果您不调用 CompleteAdding() 那么有可能可以添加更多项目,因此 IsCompleted 将始终 return false.