我似乎找不到支持简单的Remove()函数的.NET线程安全/并发集合,我可以删除特定项目或传入谓词以根据该项目删除项目。我试过了:
BlockingCollection<T>
ConcurrentQueue<T>
ConcurrentStack<T>
ConcurrentBag<T>
有没有人知道支持这种行为的集合,还是我必须自己创建?
我希望能够从线程安全队列中获取下一个项目而不将其删除,稍后如果满足某个条件,则继续删除它。
答案 0 :(得分:8)
你试过ConcurrentDictionary
吗?它有TryRemove
方法,因此如果您将该键视为谓词,那么您将删除正确的项目。
答案 1 :(得分:4)
您确定ConcurrentQueue<T>
不符合您的需求吗?它有一个TryPeek
方法和一个TryDequeue
方法,它完全按照您在上一段中描述的方式执行。
答案 2 :(得分:1)
此处的其他答案不直接回答问题,或提供可能不受欢迎的限制。例如,ConcurrentDictionary 使用防止添加重复实例的键。
SynchronizedCollection 似乎是所需要的,因为它是线程安全的并且包含一个 Remove 方法。
代码示例:
SynchronizedCollection<string> FilePathsToIgnore = new SynchronizedCollection<string>();
...
FilePathsToIgnore.Add(someFileName);
...
if(FilePathsToIgnore.Contains(fileName))
{
FilePathsToIgnore.Remove(fileName);
}