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

本文关键字:安全 集合 线程 删除项目 支持 | 更新日期: 2023-09-27 18:26:07

我似乎找不到一个支持简单Remove()函数的.NET线程安全/并发收集,在该函数中,我可以删除特定项,也可以传入谓词来删除基于该项的项。我试过:

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

有人知道支持这种行为的集合吗,或者我必须创建自己的集合吗?

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

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

您尝试过ConcurrentDictionary吗?它有一个TryRemove方法,所以如果您将键视为谓词,那么您将删除正确的项。

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

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

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

https://learn.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);
}