我相信這工作,我已經與多個併發線程測試它(儘管沒有詳盡的競爭條件和死鎖):C#.NET 4.0 ConcurrentDictionary:鎖內的TryRemove?
public static System.Collections.Concurrent.ConcurrentDictionary<string, item> dict =
new System.Collections.Concurrent.ConcurrentDictionary<string, item>();
public static item dump;
...
foreach (System.Collections.Generic.KeyValuePair<string, item> x in dict)
{
lock (x.Value)
{
if (x.Value.IsCompleted)
{
dict.TryRemove(x.Key, out dump);
}
}
}
這個問題是排序的這個問題的延續:
Can I remove items from a ConcurrentDictionary from within an enumeration loop of that dictionary?
而且這個問題:
Updating fields of values in a ConcurrentDictionary
在,我做兩個「冒險」演習:
- 刪除值從
ConcurrentDictionary
而在同一時間,通過它枚舉(這似乎是確定)。 - 鎖定
ConcurrentDictionary
的Value
部分。必要的,因爲操縱值的字段不是線程安全的,只有操縱ConcurrentDictionary
的值本身是線程安全的(上面的代碼是實際操縱值的字段的較大代碼塊的片段)。
感謝喬恩 是:轉儲意味着是一個毫無意義的包羅萬象。我會將它變成局部變量,因爲全局範圍public static是一個漏洞。 項目中的屬性:我將鎖定單個屬性而不是項目,如您所建議的。可能會有一種更優雅的方式來處理這個問題,但這些屬性會在一個線程中更改,在另一個線程中讀取,並在第三個項目級別刪除乾杯! – circletimessquare 2010-06-22 10:01:04