2017-02-02 12 views
7

मैं हमेशा उलझन में हूं कि इनमें से कौन सा चुनना है। मैं इसे देखना जैसा कि मैंने DictionaryList से अधिक का उपयोग करता है, तो मैं तो मैं आसानी से अपने key द्वारा एक मूल्य प्राप्त कर सकते हैं एक Key और Value के रूप में दो डेटा प्रकार चाहते हैं, लेकिन अगर मैं एक ConcurrentDictionary या Dictionary का उपयोग करना चाहिए मैं हमेशा उलझन में हूँ?मुझे ConcurrentDictionary और Dictionary का उपयोग कब करना चाहिए?

इससे पहले कि आप इसमें अधिक शोध न डालने के लिए मेरे पास जाने से पहले मैंने कोशिश की है, लेकिन ऐसा लगता है कि Google को वास्तव में Dictionary बनाम ConcurrentDictionary पर कुछ भी नहीं मिला है लेकिन प्रत्येक व्यक्ति पर अलग-अलग कुछ है।

मैंने पहले एक दोस्त से यह पूछा है लेकिन उन्होंने कहा है: "ConcurrentDictionary का उपयोग करें यदि आप अपने शब्दकोश का बहुत उपयोग कोड में करते हैं" और मैं वास्तव में इसे बड़े विस्तार से समझाने के लिए उन्हें परेशान नहीं करना चाहता था। क्या कोई इस पर विस्तार कर सकता है?

+0

तो, अलग-अलग वस्तुओं में से प्रत्येक पर जानकारी देखने के बाद, यह आपके प्रश्न का उत्तर देने में विफल रहा कि आपको प्रत्येक का उपयोग कब करना चाहिए? यदि आपको पता है कि आपको 'डिक्शनरी' का उपयोग कब करना चाहिए और जब आपको 'ConcurrentDictionary' का उपयोग करना चाहिए, तो दिया गया है कि आप कहते हैं कि आपको पहले से ही वह जानकारी मिली है, तो आप जानते हैं कि आपको एक दूसरे के ऊपर कब उपयोग करना चाहिए। – Servy

+0

नाम का प्रकार स्वयं को समझाता है।जब आप किसी शब्दकोश में समवर्ती पहुंच की आवश्यकता होती है तो आप 'ConcurrentDictionary' का उपयोग करते हैं। –

+0

यदि आप एकाधिक धागे से शब्दकोश तक पहुंच पाएंगे तो ConcurrentDictionary का उपयोग करें। यही 'संपूर्ण' सिस्टम है। चयन। कॉनकुरेंट' नेमस्पेस – Jonesopolis

उत्तर

15

"यदि आप अपने शब्दकोश का बहुत उपयोग कोड में करते हैं तो ConcurrentDictionary का प्रयोग करें" अस्पष्ट सलाह की तरह है। मैं आपको भ्रम के लिए दोषी नहीं ठहराता हूं।

ConcurrentDictionary ऐसे वातावरण में उपयोग के लिए प्राथमिक है जहां आप कई धागे (या async कार्यों) से शब्दकोश को अपडेट करना चाहते हैं। के रूप में आप अगर यह एक एकल थ्रेड से है जैसे आप के रूप में ज्यादा कोड से एक मानक Dictionary उपयोग कर सकते हैं;)

आप एक ConcurrentDictionary पर तरीकों को देखें, तो आप TryAdd, TryGetValue, TryUpdate की तरह कुछ रोचक तरीकों का पता, और करेंगे TryRemove

उदाहरण के लिए, एक सामान्य पैटर्न पर विचार करें जो आप सामान्य Dictionary कक्षा के साथ काम करने के लिए देख सकते हैं।

// There are better ways to do this... but we need an example ;) 
if (!dictionary.ContainsKey(id)) 
    dictionary.Add(id, value); 

यह है कि क्या यह एक महत्वपूर्ण होता है और बुला Add एक अलग धागा है कि एक ही id साथ Add कह सकते हैं के लिए चेक के बीच में कोई समस्या है। जब यह धागा Add पर कॉल करता है, तो यह एक अपवाद फेंक देगा। विधि TryAdd आपके लिए यह संभालती है और एक सत्य/झूठी कहती है कि आपने इसे जोड़ा है या नहीं (या वह कुंजी पहले से ही शब्दकोश में थी)।

तो जब तक कि आप कोड के बहु-थ्रेडेड सेक्शन में काम नहीं कर रहे हैं, तो आप शायद मानक Dictionary कक्षा का उपयोग कर सकते हैं। ऐसा कहा जा रहा है कि, आप सैद्धांतिक रूप से एक शब्दकोश में समवर्ती पहुंच को रोकने के लिए ताले लगा सकते हैं; वह सवाल पहले से ही "Dictionary locking vs. ConcurrentDictionary" में पता है।

+1

उत्तर के लिए धन्यवाद, इससे बहुत मदद मिली। एक सिंगल थ्रेड से आने पर भी ऐसी बुरी चीज होने पर भी एक ConcurrentDictionary का उपयोग करना होगा? – Ashkru

+1

क्या आप गैर समवर्ती रूप का उपयोग कर सकते हैं, यदि आप धागे बनाने से पहले लेखन करते हैं (एक बहु थ्रेडिंग, केवल पढ़ता है)? मैं कल्पना करता हूं कि यह तेज़ है, और यह नहीं देख सकता कि यह कैसे टूट सकता है (जब तक आप कुछ मूर्खतापूर्ण नहीं करते, जैसे इसे लिखना)। –

+0

'ConcurrentDictionary' का उपयोग करने में शायद कोई समस्या नहीं है, लेकिन मुझे लगता है कि कम से कम कुछ ओवरहेड होगा जो इस बात पर निर्भर करता है कि शब्दकोश का उपयोग कैसे किया जा सकता है। यदि आप यह देखने के लिए स्रोत की तुलना करना चाहते हैं कि क्या हो रहा है, तो [ConcurrentDictionary.TryAddInternal()] के लिए स्रोत देखें (https://referencesource.microsoft.com/#mscorlib/system/Collections/Concurrent/ConcurrentDictionary.cs, bc495056297a0851) और [Dictionary.Insert()] (https://referencesource.microsoft.com/#mscorlib/system/collections/generic/dictionary.cs,fd1acf96113fbda9)। –

0

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

+0

हर जगह एक ConcurrentDictionary का उपयोग करना चाहे भले ही यह एक धागे से आ रहा हो तो ऐसी बुरी चीज हो? – Ashkru

+0

नहीं, क्योंकि अगर आप अपने कार्यक्रम को मल्टीथ्रेड करने की योजना नहीं बनाते हैं तो आप किसी को भी अपना कोड पढ़ने में भ्रमित करेंगे। इसके अलावा, मैं किसी भी समवर्ती डेटा संरचना में कुछ अतिरिक्त ओवरहेड की अपेक्षा करता हूं क्योंकि एक्सेस विशेषाधिकारों को कई धागे में प्रबंधित किया जाना चाहिए – Woody1193

+0

आप कहते हैं कि इसके बाद कोई बुरी बात नहीं है, क्या यह एक बुरी बात है? कारण मैं पूछ रहा हूं क्योंकि वर्तमान में यह मुख्य धागे की तुलना में अन्य धागे से नहीं पहुंचता है लेकिन यह भविष्य में हो सकता है। यदि मैं बहु थ्रेडिंग को लागू करने का निर्णय लेता हूं तो क्या सभी तरीकों को संभालने या मेरे कोड को बदलने के लिए एक समवर्ती का उपयोग करना उचित है? – Ashkru

0

Dictionary से अधिक का उपयोग करने का सबसे बड़ा कारण थ्रेड सुरक्षा है। यदि आपके एप्लिकेशन को एक ही समय में एक ही शब्दकोश का उपयोग करके एकाधिक धागे मिलेंगे, तो आपको थ्रेड-सुरक्षित CocurrentDictionary की आवश्यकता होगी, यह विशेष रूप से सच है जब ये धागे शब्दकोश को लिख रहे हैं या बना रहे हैं।

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

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