非常簡單:除了ConcurrentDictionary(如果必須使用它,但它不是真正的正確概念),是否有任何Concurrent集合(IProducerConsumer實現)支持根據項目的簡單等同性來移除特定項目,或者定義移除條件的謂詞?支持刪除指定項目的併發收集?
說明:我有一個多線程,多階段的工作流程算法,它從數據庫中提取對象,並將它們放在「開始」隊列中。從那裏他們被下一個階段抓住,進一步工作,並塞進其他隊列。這個過程經過幾個階段。與此同時,第一階段由主管再次調用並將對象從數據庫中提取出來,這些對象可以包含仍在處理中的對象(因爲它們還沒有完成處理,因此沒有用標記集說話他們完成了)。
我正在設計的解決方案是一個「在工作中」的集合;對象在第一階段進行檢索時進入該隊列,並且在工作流程的任何階段完成必要的處理後將其重新保存到DB中作爲「已處理」被刪除。當該對象在該列表中時,如果它被第一階段重新檢索,它將被忽略。我已經計劃使用ConcurrentBag,但唯一的刪除方法(TryTake)會從包中刪除任意項目,而不是指定的項目(並且在.NET 4中ConcurrentBag是緩慢的)。 ConcurrentQueue和ConcurrentStack也不允許刪除它會給你的下一個項目以外的項目,而留下ConcurrentDictionary,它可以工作,但比我需要的要多(我真正需要的是存儲正在處理的記錄的Id;他們不會在工作流程中更改)。
你如何看待使用ReaderWriterLockSlim和一個列表?或者也許滾動你自己的同時收藏 – Frobzig 2012-07-27 21:12:32
@Frobzig - 對溫和感興趣的矛盾。我喜歡Concurrent系列,因爲它們只是工作。涉及很少的代碼。 – KeithS 2012-07-27 21:25:57