我在.NET8中try BlockingCollection<T>
(作为一个队列),有时我会得到一个异常:
"System.InvalidOperationException: The collection argument is empty and has been marked as complete with regards to additions."
代码示例:
private static void TestMethod()
{
using BlockingCollection<DummyClass> queue = new BlockingCollection<DummyClass>();
var task = Task.Run(() => //Produce
{
for (int i = 0; i < 10000000; i++)
{
queue.Add(new DummyClass());
}
queue.CompleteAdding();
});
int counter = 0;
try
{
while (!queue.IsCompleted) //Consume
{
DummyClass item = queue.Take(); // <-- Sometimes exception here
counter++;
}
Console.WriteLine($"counter={counter} ");
}
catch (Exception ex)
{
Console.WriteLine("Error:" + ex.ToString());
}
}
IsComplete声明"此集合是否已被标记为已完成添加and is empty."
因此,只要尚未调用CompleteAdding(),Take()就应该被阻塞,并且当CompleteAdding()已经被调用并且队列为空时,"!quee.IsComplete"就应该返回FALSE.
我遗漏了什么?
任何帮助都将不胜感激.
运行在Windows 11上的VS2022 17.8.5中.