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