2011-01-03 30 views
6

में ConcurrentDictionary में AddOrUpdate विधि का उपयोग करना मुझे समवर्ती संग्रह और थ्रेडिंग में परेशानी का सामना करना पड़ रहा है, विशेष रूप से ConcurrentDictionary में AddOrUpdate विधि का उपयोग करके ..... मैं इसे उपयोग में नहीं डाल पा रहा हूं .. मैं नहीं कर सका इस पर कोई अच्छा उदाहरण खोजने के ... और यह भी पूरी तरह से MSDN प्रोग्रामिंग गाइड में ConcurrentQueue का उदाहरण नहीं समझ सकता है, .. ConcurrentDictionary में.NET 4.0


AddOrUpdate विधि मूल रूप से ..... मैं नहीं सक्षम करने के लिए कर रहा हूँ इसे उपयोग में डाल दें .. मुझे इस पर कोई अच्छा उदाहरण नहीं मिला ... और पूरी तरह से समझ में नहीं आया, एमएसडीएन प्रोग्रामिंग गाइड में ConcurrentQueue का उदाहरण ..

+0

कौन मुसीबतों आप सामना कर रहे हैं? कोई त्रुटि संदेश? –

+0

मूल रूप से ConcurrentDictionary में AddOrUpdate विधि ..... मैं इसे उपयोग में नहीं डाल पा रहा हूं .. मुझे इस पर कोई अच्छा उदाहरण नहीं मिला ... और यह पूरी तरह से समझ में नहीं आया, एमएसडीएन प्रोग्रामिंग में ConcurrentQueue का उदाहरण गाइड .. – Cheshta

+1

आपके पास "एक विशिष्ट उपकरण का उपयोग करने में समस्याएं" हैं। लेकिन आप जो भी हासिल करना चाहते हैं उस पर कोई जानकारी के बिना (और क्यों) कोई अच्छा जवाब नहीं हो सकता है। वोटिंग एनएआरक्यू। –

उत्तर

28

एक नियमित शब्दकोश में, आप इस तरह कोड देख सकते हैं:

Dictionary<string, int> dictionary = GetDictionary(); 

if (dictionary.ContainsKey("MyKey")) 
{ 
    dictionary["MyKey"] += 5; 
} 
else 
{ 
    dictionary.Add("MyKey", 5); 
} 

यह नहीं है थ्रेड-सुरक्षित कोड। कई रेस स्थितियां हैं: ContainsKey पर कॉल के बाद "माईकी" को जोड़ा/हटाया जा सकता है, और += ऑपरेटर का उपयोग करके लाइन में पढ़ने और असाइनमेंट के बीच "MyKey" से जुड़े मान (यदि कोई है) को बदला जा सकता है।

AddOrUpdate विधि या अद्यतन पर कि क्या कुंजी मौजूद है निर्भर करता है, किसी कुंजी के साथ जुड़े मूल्य जोड़ने के लिए एक तंत्र प्रदान करके इन सूत्रण मुद्दों को हल करने का इरादा है। यह TryGetValue के समान है जिसमें यह कई परिचालनों को जोड़ता है (इस मामले में, एक कुंजी की जांच कर रहा है, और या संशोधित कुंजी की उपस्थिति के आधार पर एक मान को संशोधित करता है) एक प्रभावी परमाणु क्रिया में दौड़ की स्थिति के लिए अतिसंवेदनशील नहीं है ।

बस इस ठोस बनाने के लिए, आपके द्वारा उपरोक्त कोड AddOrUpdate का उपयोग कर ठीक होता है:

ConcurrentDictionary<string, int> dictionary = GetDictionary(); 

// Either insert the key "MyKey" with the value 5 or, 
// if "MyKey" is already present, increase its value by 5. 
dictionary.AddOrUpdate("MyKey", 5, (s, i) => i + 5);