很简单:除了 ConcurrentDictionary (如果我必须使用它,但它不是真正正确的概念)之外,是否有任何 Concurrent 集合(IProducerConsumer 实现)支持基于项目或谓词的简单相等来删除特定项目定义移除条件?
说明:我有一个多线程、多阶段的工作流算法,它从数据库中提取对象并将它们放在“开始”队列中。从那里他们被下一阶段抓住,进一步处理,并塞进其他队列。这个过程会持续几个阶段。同时,第一阶段由其主管再次调用并将对象从数据库中拉出,这些对象可能包括仍在处理中的对象(因为它们尚未完成处理,因此尚未使用标志集重新持久化)他们完成了)。
我正在设计的解决方案是“工作中”的大师系列;对象在第一阶段检索以进行处理时进入该队列,并在工作流的任何阶段完成必要处理后将它们重新保存到数据库作为“已处理”后将其删除。当对象在该列表中时,如果它被第一阶段重新检索,它将被忽略。
我曾计划使用 ConcurrentBag,但唯一的删除方法 (TryTake) 从包中删除任意项目,而不是指定的项目(并且 ConcurrentBag在 .NET 4 中很慢)。ConcurrentQueue 和 ConcurrentStack 也不允许删除它会给你的下一个项目以外的项目,留下 ConcurrentDictionary,它可以工作但超出我的需要(我真正需要的是存储正在处理的记录的 Id;它们在工作流程中不会改变)。