- 此问题在此处已有答案**:
Concurrent collections and unique elements(2个答案)
How to access the underlying default concurrent queue of a blocking collection?(4个答案)
六年前关闭了。
在尝试添加一个新项目之前,检查BlockingCollection
中是否存在一个项目的最佳方法是什么?基本上,我不希望重复的项目添加到BlockingCollection
中。
Concurrent collections and unique elements(2个答案)
How to access the underlying default concurrent queue of a blocking collection?(4个答案)
六年前关闭了。
在尝试添加一个新项目之前,检查BlockingCollection
中是否存在一个项目的最佳方法是什么?基本上,我不希望重复的项目添加到BlockingCollection
中。
2条答案
按热度按时间mqkwyuun1#
你必须实现你自己的
IProducerConsumerCollection<T>
,它的行为就像一个集合(例如,不允许重复)。这里是一个简单的版本,它使用临界区(C#lock
)来使它线程安全。对于高并发场景,你可以像ConcurrentQueue<T>
一样使用SpinWait
类来提高性能。如果需要,您可以通过提供一个可选的
IEqualityComparer<T>
(然后用于初始化HashSet<T>
)来详细说明此类以自定义相等性。IProducerConsumerCollection<T>.Add
方法在试图插入重复项时返回false
,这将导致BlockingCollection<T>.Add
方法抛出InvalidOperationException
,因此您可能需要将代码打包,以便将项添加到如下内容中:请注意,如果向已完成的集合添加项,则还会得到
InvalidOperationException
,并且必须检查异常消息以确定异常的根本原因。wa7juj8i2#
使用
TryAdd(data)
方法。还可以传入timespan
对象或和指示超时期限的int
。返回true
或false
。请注意,如果基础集合类型无法处理重复项,并且您尝试添加的数据是重复项,则会引发InvalidOperationException
。