我似乎找不到一个支持简单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);
}