मेरा मानना है कि यह काम करता है, मैं (हालांकि दौड़ की स्थिति और गतिरोध के लिए नहीं विस्तृत रूप से) एकाधिक समवर्ती धागे के साथ जाँच की है:सी # .NET 4.0 ConcurrentDictionary: एक लॉक के भीतर कोशिश करें?
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
कि मैं दो "dicey" युद्धाभ्यास कर रहा हूँ: एक ConcurrentDictionary
से
- निकाला जा रहा है मानों एक ही समय में यह माध्यम से गणना (जो ठीक हो रहा है)।
- के
Value
भाग को लॉक करना। आवश्यक है क्योंकि मान के फ़ील्ड में हेरफेर करना थ्रेड सुरक्षित नहीं है, केवलConcurrentDictionary
के मूल्यों को मैन्युअल रूप से जोड़ना थ्रेड सुरक्षित है (ऊपर दिया गया कोड एक बड़े कोड ब्लॉक का एक स्निपेट है जिसमें मूल्यों के क्षेत्र वास्तव में छेड़छाड़ किए जाते हैं)।
धन्यवाद जॉन हाँ: डंप एक व्यर्थ मोहक करने के लिए है।मैं इसे एक स्थानीय चर में बदल दूंगा, क्योंकि एक वैश्विक दायरा सार्वजनिक स्थैतिक एक भेद्यता आइटम के भीतर गुण है: जैसा कि आप सुझाव देते हैं, मैं आइटम के बजाय व्यक्तिगत गुणों को लॉक कर दूंगा। इसे संभालने के लिए एक और शानदार तरीका हो सकता है, लेकिन इन गुणों को एक थ्रेड में बदल दिया जाएगा, दूसरे में पढ़ा जाएगा, और तीसरे चीयर्स में आइटम स्तर पर हटा दिया जाएगा! – circletimessquare