2012-10-05 7 views
9

मैं consistenlty एक बहु सूत्रण .net 3.5 आवेदन"इंडेक्स को सरणी के किनारे से बाहर" कैसे बनाया जाए, शब्दकोश में आइटम जोड़ना?

त्रुटि 26 अपवाद फेंक दिया पर इस त्रुटि हो रही है। विवरण: 'System.IndexOutOfRangeException: अनुक्रमणिका सरणी के सीमाओं के बाहर थी।

System.Collections.Generic.Dictionary`2.Insert (TKey कुंजी, TValue मूल्य, बूलियन ऐड)

System.Collections.Generic.Dictionary`2.Add पर

(TKey कुंजी, TValue मूल्य)

पर

मुझे लगता है कि मुझे पता है कि इसे कैसे ठीक किया जाए (लॉक जहां एप्रोपियेट) जोड़ना है, लेकिन मैं अपने स्थानीय पर्यावरण पर इस समस्या को फिर से बनाने में सक्षम होना चाहता हूं, इसलिए मुझे यकीन है कि मैंने इसे ठीक किया है और मैं भी सक्षम हूं इसके लिए एक यूनिट परीक्षण जोड़ने के लिए।

क्या आप इसे फिर से बनाने के लिए कोई निरंतर तरीका जानते हैं?

+0

क्या कोई विशेष कारण है कि आप 'ConcurrentDictionary' का उपयोग नहीं कर रहे हैं? – Sconibulus

+0

@ स्कोनिबुलस: यह ऐप 3 है।5, 'ConcurrentDictionary' का उपयोग नहीं कर सकता :( – StackOverflower

उत्तर

8
Dictionary<string, string> dict = new Dictionary<string, string>(); 

Task.Factory.StartNew(() => { while (true) dict["a"] = "a"; }); 
Task.Factory.StartNew(() => { while (true) dict.Remove("a"); }); 
+0

के लिए धन्यवाद धन्यवाद, यह एक शब्दकोश त्रुटि को मजबूर करता है, लेकिन ओपी के बाकी हिस्सों के आधार पर जो खेल में है और उसके प्रस्तावित समाधान के आधार पर, यह बिल्कुल सही नहीं है सहायक। – NotMe

+0

इस कोड के साथ मैं समस्या को फिर से बनाने में सक्षम हूं, दुर्भाग्यवश मेरे असली कोड के साथ ऐसा नहीं कह सकता है। प्रश्न को हल करने के रूप में चिह्नित करना क्योंकि मुझे लगता है कि यह सबसे अच्छा है जिसे मैं कोड की पंक्तियों को फेंकने के बिना प्राप्त कर सकता हूं मिश्रण के लिए। धन्यवाद! – StackOverflower

4

दुर्भाग्य से, एक बहुप्रचारित अनुप्रयोग में संगत होने पर जहां दौड़ की स्थिति होती है, वह बस प्राप्त नहीं होती है।

आपकी मशीन और उत्पादन के बीच अकेले हार्डवेयर अंतर यह सुनिश्चित करेंगे कि कोई समस्या होने पर, यह एक ही स्थान पर नहीं हो सकता है। यहां तक ​​कि यदि हार्डवेयर समान है, सॉफ़्टवेयर मतभेद (विशेष रूप से उन पृष्ठभूमि सेवाओं) समय के अंतर को जन्म दे सकते हैं और इसलिए ऐसी स्थिति जहां यह दोहराने योग्य नहीं है।

हेक, अगर उन धागे में बाहरी संसाधनों (जैसे डीबी कॉल) पर निर्भरता है तो उत्पादन और आपके परीक्षण बॉक्स के बीच नेटवर्क विलंबता अंतर यह सुनिश्चित कर सकता है कि आप इसे कभी भी डुप्लिकेट नहीं कर सकते।

सर्वर पर एक डीबगर होने का शर्म (बुरा बुरा विचार), सबसे अच्छी चीज जो आप कर सकते हैं वह कोड का एक दृश्य विश्लेषण है, जो भागों को आप तय करने की आवश्यकता है उसे ठीक करें, परीक्षण करें (साथ ही आप इसे भी देख सकते हैं) फिर इसे उत्पादन में छोड़ दें और देखें।

+0

+1 आपके उत्तर – StackOverflower

1

यह आपको त्रुटि पुनः बनाना स्थानीय स्तर पर है, लेकिन पूरी तरह से त्रुटि दूर करने के लिए मदद नहीं करेगा, सामान्य Dictionary<TKey, TValue> के लिए MSDN डॉक्स कहते हैं:

एक धागा सुरक्षित विकल्प के लिए, ConcurrentDictionary<TKey, TValue> देखना ।

ConcurrentDictionary<TKey, TValue> के लिये दस्तावेज कहते हैं:

कुंजी-मान जोड़ों कि से अधिक थ्रेड समवर्ती द्वारा पहुँचा जा सकता है की एक धागा सुरक्षित संग्रह का प्रतिनिधित्व करता है।

नोट तथापि, कि ConcurrentDictionary < TKey, TValue > नेट 4 और में ही उपलब्ध है।

+0

मेरा ऐप 3.5 है, 'ConcurrentDictionary' का उपयोग नहीं कर सकता :( – StackOverflower

0

आप रीडरवाइटर लॉकस्लिम के साथ शब्दकोश के लिए एक रैपर क्यों नहीं बनाते हैं। इस तरह आप एक वर्ग में सभी लॉकिंग कर चुके हैं।

संबंधित मुद्दे