2008-11-29 15 views
10

हैशटेबल्स में एक सिंक्रूट संपत्ति है लेकिन सामान्य शब्दकोश नहीं हैं।शब्दकोश के लिए हैशटेबल <> सिंक्रूट।

lock (hashtable.Syncroot) 
{ 
.... 
} 

मैं यह कैसे दोहराने चलेगा कि मैं hashtable को हटाने कर रहा हूँ और सामान्य शब्दकोशों के लिए बदल: यह करता है कि अगर मैं कोड है?

उत्तर

10

यदि आप सख्ती से अनुकूलता के लिए जा रहे हैं तो ब्रायन सही है। एक शब्दकोश के शीर्ष पर अपने वर्तमान अर्थशास्त्र को बनाए रखने का यह सबसे अच्छा तरीका है।

हालांकि इसमें विस्तार करना। जेनेरिक डिक्शनरी में सिंक्रूट संपत्ति को सीधे जोड़ा नहीं जाने का कारण यह है कि यह सिंक्रनाइज़ेशन करने का एक खतरनाक तरीका है। यह "लॉक (यह)" से केवल थोड़ा बेहतर है जो बहुत खतरनाक है और मृतकों के लिए प्रवण है। यहां कुछ लिंक दिए गए हैं जो यह कहते हैं कि यह क्यों बुरा है।

+0

यानी, ऐसा मत करो। – Will

+5

पूरी तरह से सहमत हैं। फिर भी जब लोग "यह बुरा है, इसे मत करो" के साथ जवाब देते हैं तो मैं वास्तव में इससे नफरत करता हूं :) :)। अधिकांश समय लोग एक प्रश्न पूछते हैं, वे अक्सर एक विशेष परिदृश्य में फंस जाते हैं और इसके माध्यम से काम करने की आवश्यकता होती है। मैं समस्या पर सलाह देने और सलाह क्यों देता हूं कि यह बुरा क्यों है और इससे कैसे बचें। – JaredPar

5
var dictionary = new Dictionary<int, string>(); 

lock(((ICollection) dictionary).SyncRoot) 
{ 
    // ... 
} 
3

hashtable/शब्दकोश सार्वजनिक नहीं है, तो आप सिर्फ वस्तु ही शब्दकोश लॉक कर सकता।

7

सिंक्रूट के पीछे नई सोच यह है कि यह मूल डिजाइन में एक गलती थी। यदि लॉक करने की एकमात्र चीज डिक्शनरी है और यह निजी है, तो आप इसे या अन्य ऑब्जेक्ट को लॉक कर सकते हैं जो सिंक्रनाइज़ेशन ऑब्जेक्ट के रूप में कार्य करता है। उत्तरार्द्ध तकनीक तब उपयोगी होती है जब आप जिस राज्य की रक्षा कर रहे हैं वह सिर्फ शब्दकोश से अधिक है।

// used as you would have used SyncRoot before 
object _syncLock = new object(); 
Dictionary<string, int> numberMapper = new Dictionary<string, int>(); 

// in some method... 
lock (_syncLock) 
{ 
    // use the dictionary here. 
} 
+0

आप एक स्रोत बोली पर है कि यह मूल डिजाइन में एक गलती थी हैं? – dalle

+1

ब्रैड अब्राम और क्रिजिट्टोफ कैवलिना (.NET के प्रोग्राम मैनेजर) कहते हैं: http://blogs.msdn.com/brada/archive/2003/09/28/50391.aspx – netadictos

+0

जेफरी रिचटर भी सीएलआर में डिजाइन में इस त्रुटि को शामिल करता है सी # के माध्यम से। – Will

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