हाल ही में मैं निम्न अपवाद में जब एक सामान्य शब्दकोशसमवर्ती शब्दकोश का उपयोग करना - थ्रेड सुरक्षित संग्रह संशोधन
एक InvalidOperationException आ गई है का उपयोग करते हुए चल रहा था। एक संग्रह संशोधित किया गया था
मुझे एहसास हुआ कि यह त्रुटि मुख्य रूप से स्थिर शब्दकोश पर थ्रेड सुरक्षा समस्याओं के कारण थी।
एक छोटी सी पृष्ठभूमि: मेरे पास वर्तमान में एक ऐसा एप्लिकेशन है जिसमें इस मुद्दे से संबंधित 3 अलग-अलग विधियां हैं।
- विधि ए
foreach
का उपयोग करके शब्दकोश के माध्यम से पुनरावृत्त करता है और एक मान देता है। - विधि बी शब्दकोश में डेटा जोड़ता है।
- विधि सी शब्दकोश में कुंजी के मान को बदलता है।
कभी-कभी शब्दकोश के माध्यम से पुनरावृत्ति करते समय भी डेटा जोड़ा जा रहा है, जो इस मुद्दे का कारण है। मैं इस अपवाद को foreach
में अपने कोड का हिस्सा प्राप्त करता हूं जहां मैं शब्दकोश की सामग्री पर पुन: प्रयास करता हूं। इस समस्या को हल करने के लिए, मैंने सामान्य शब्द को ConcurrentDictionary
के साथ बदल दिया और यहां मैंने जो किया है उसके विवरण यहां दिए गए हैं।
उद्देश्य: मेरा मुख्य उद्देश्य पूरी तरह से अपवाद
विधि बी के लिए (जो शब्दकोश में नया कुंजी कहते हैं) मैं TryAdd
विधि सी के लिए साथ .Add
प्रतिस्थापित दूर करने के लिए है (जो शब्दकोश के मूल्य को अद्यतन करता है) मैंने कोई बदलाव नहीं किया है। कोड का एक स्केच इस प्रकार है:
static public int ChangeContent(int para)
{
foreach (KeyValuePair<string, CustObject> pair in static_container)
{
if (pair.Value.propA != para) //Pending cancel
{
pair.Value.data_id = prim_id; //I am updating the content
return 0;
}
}
return -2;
}
विधि के लिए एक - मैं बस शब्दकोश से अधिक पुनरावृत्ति कर रहा हूँ और इस जहां चल कोड बंद हो जाता है (डिबग मोड में) और दृश्य स्टूडियो मुझे इस है कि आपको सूचित करता है है, जहां त्रुटि occured.The कोड मैं उपयोग कर रहा हूँ निम्नलिखित
static public CustObject RetrieveOrderDetails(int para)
{
foreach (KeyValuePair<string, CustObject> pair in static_container)
{
if (pair.Value.cust_id.Equals(symbol))
{
if (pair.Value.OrderStatus != para)
{
return pair.Value; //Found
}
}
}
return null; //Not found
}
के समान है इन परिवर्तनों को अपवाद है कि मैं हो रही है को हल करने जा रहे हैं।
संपादित करें:
यह this page पर कहा गया है कि विधि GetEnumerator
आप लेखन के साथ समानांतर में तत्वों के माध्यम से पार करने के लिए (हालांकि यह पुरानी हो सकती है) की अनुमति देता है। क्या वह foreach का उपयोग करने के समान नहीं है?
फोएच वास्तव में ऐसा करता है - GetEnumerator/MoveNext/Current को कॉल करना। कृपया तीसरी विधि का कोड दिखाएं जो शब्दकोश की सामग्री को संशोधित करता है, जिस लाइन पर आपको अपवाद मिलता है? – Bond
क्या मैं सही हूं कि आपने अभी तक एक नया दृष्टिकोण नहीं देखा है? – sll
@ एसएलएल यहाँ एक जवाब था जिसने सुझाव दिया कि मैं '.ToList()' का उपयोग करता हूं और फिर परिणाम के माध्यम से पुन: प्रयास करता हूं। मुझे लगता है कि इसे हटा दिया गया है – MistyD