2011-08-15 12 views
14

निम्नलिखित कोड का उपयोग कर MSDN से है:सी # - लॉक सवाल EnterWriteLock

private ReaderWriterLockSlim cacheLock = new ReaderWriterLockSlim(); 
private Dictionary<int, string> innerCache = new Dictionary<int, string>(); 

public void Add(int key, string value) 
{ 
    cacheLock.EnterWriteLock(); 
    try 
    { 
     innerCache.Add(key, value); 
    } 
    finally 
    { 
     cacheLock.ExitWriteLock(); 
    } 
} 

मैं (अन्य जगहों EnterWriteLock में इस तरह कोड को देखा है) हमेशा कोशिश ब्लॉक के बाहर है। क्या किसी को पता है कि यह कोशिश ब्लॉक के अंदर क्यों नहीं है?

उत्तर

17

मान लीजिए EnterWriteLock() विफल रहता है। जो कोई भी कारण के लिए।

तब एक चीज जो आपको नहीं करना चाहिए वह उस लॉक से बाहर निकलना है जिसे आपने कभी नहीं बदला है।

यह एक बहुत ही बुनियादी पैटर्न है जो धाराओं के लिए उदाहरण के लिए भी रखता है, लेकिन using() {} कथन के लिए अक्सर धन्यवाद नहीं देखा जाता है।

var s = File.Create(...); 
// (only) if the previous line succeeded, 
// we gain the responsibility to close s, no matter what 
try 
{ 
    // do some I/O 
} 
finally 
{ 
    s.Dispose(); 
} 
5

क्योंकि यह एक बग होगा। आप ExitWriteLock को तब तक कॉल नहीं कर सकते जब तक आप सुनिश्चित न हों कि आपने इसे दर्ज किया है। कल्पना करें कि क्या होता है यदि आप इसे अंदर ले जाएं {} और EnterWriteLock() अपवाद फेंकता है। यह एक डबल कबूम है। Kabloom, अपवाद संदेश screws।

3

यदि एंटरवाइट लॉक अपवाद फेंकता है, तो ExitWriteLock को कॉल करने की कोई आवश्यकता नहीं है, इसलिए कारण यह प्रयास ब्लॉक में नहीं है। EnterWriteLock को सफलतापूर्वक बुलाया जाने पर ExitWriteLock को हमेशा कॉल किया जाना चाहिए। आप कुछ परिदृश्यों में EnterWriteLock के आस-पास एक ब्लॉक ब्लॉक को लपेटना चाह सकते हैं क्योंकि यह लॉकरेकर्सियन अपवाद को फेंक सकता है। ExitWriteLock एक सिंक्रनाइज़ेशन लॉक अपवाद भी फेंक सकता है और आपके एप्लिकेशन में एक कोशिश ब्लॉक की आवश्यकता हो सकती है।

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