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;
}
......
IsCompleted
在 https://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
.
以下代码永远不会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;
}
......
IsCompleted
在 https://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
.