c# - 从 BlockingCollection 中取出项目的正确方法是什么?

标签 c# .net generics collections synchronization

调用 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/

相关文章:

c# - "IsDlg=1"是什么意思? - 共享网站

c# - 如何从表名指定为 SqlParameter 的表中进行选择?

c# - MySQL - 键 "PRIMARY"的重复条目

c# - 还有其他类似的 ObservableCollection<T> 吗?

java - 什么是原始类型,为什么我们不应该使用它呢?

java - 为什么 Mockito 给我一个新的 map 实例?

c# - EF4 Poco 问题映射类型相同的名称相同的程序集不同的命名空间

.Net 间歇性 System.Web.Services.Protocols.SoapHeaderException

.net - 如何使用 Click Once 构建单实例应用程序?

java - 使用类作为键插入哈希表的通用方法