即使队列为空,queue.IsCompleted 也会返回 false?

ca9*_*3d9 2 c# blockingqueue task-parallel-library

以下代码永远不会返回。调试表明,即使队列为空, 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;
        }
    ......
Run Code Online (Sandbox Code Playgroud)

小智 5

该物业IsCompletedhttps://msdn.microsoft.com/en-us/library/dd267315(v=vs.110).aspx有如下文字:

此集合是否已标记为已完成添加且为空。

您在哪里将集合标记为已完成?这不是一张空支票——它是一张带有手动附加开关的空支票。

因此,有一种CompleteAdding()方法可以标记不再添加更多项目。