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