调用 BlockingCollection.Take() 时,集合的 IsCompleted 状态可能会在检查 IsCompleted 和调用 Take() 之间发生变化。
MSDN Documentation显示的示例只是捕获无效操作异常,但似乎必须有一种正确的方法来执行此类调用而不捕获异常(因为这会产生相当大的开销并且在代码中看起来不干净)。调用 .Take() 并避免无效操作异常的正确方法是什么?
我的特定问题的简化版本:
If (!blockingCollection.IsCompleted)
{
//do some stuff
value = blockingCollection.Take(); //Throws Exception, IsCompleted = True;
}
有一个 TryTake 方法可用,但我的印象是它可以传递超时和取消标记,而不是处理在检查和 Take( ) 被调用。
最佳答案
您可以使用 TryTake overload with no timeout/cancelation .如果 BlockingCollection
为空或已标记为已完成,它将返回 false,并正确处理您面临的同步问题。
关于c# - 从 BlockingCollection 中取出项目的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7110856/