支持删除项目的线程安全集合

时间:2012-02-29 21:10:47

标签: c# collections concurrency thread-safety concurrent-programming

我似乎找不到支持简单的Remove()函数的.NET线程安全/并发集合,我可以删除特定项目或传入谓词以根据该项目删除项目。我试过了:

BlockingCollection<T>
ConcurrentQueue<T>
ConcurrentStack<T>
ConcurrentBag<T>

有没有人知道支持这种行为的集合,还是我必须自己创建?

我希望能够从线程安全队列中获取下一个项目而不将其删除,稍后如果满足某个条件,则继续删除它。

3 个答案:

答案 0 :(得分:8)

你试过ConcurrentDictionary吗?它有TryRemove方法,因此如果您将该键视为谓词,那么您将删除正确的项目。

答案 1 :(得分:4)

您确定ConcurrentQueue<T>不符合您的需求吗?它有一个TryPeek方法和一个TryDequeue方法,它完全按照您在上一段中描述的方式执行。

答案 2 :(得分:1)

此处的其他答案不直接回答问题,或提供可能不受欢迎的限制。例如,ConcurrentDictionary 使用防止添加重复实例的键。

SynchronizedCollection 似乎是所需要的,因为它是线程安全的并且包含一个 Remove 方法。

https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.synchronizedcollection-1?view=dotnet-plat-ext-5.0

代码示例:

SynchronizedCollection<string> FilePathsToIgnore = new SynchronizedCollection<string>();
...

FilePathsToIgnore.Add(someFileName);
...

if(FilePathsToIgnore.Contains(fileName))
{
    FilePathsToIgnore.Remove(fileName);
}