2010-12-06 15 views
9

मुझे lock(myLock){ /* do stuff */} के सी # में शॉर्टकट पसंद है। क्या पढ़ने/लिखने के ताले के बराबर है? (विशेष रूप से ReaderWriterLockSlim।) अभी, मैं निम्नलिखित कस्टम विधि का उपयोग करता हूं, जो मुझे लगता है कि काम करता है, लेकिन यह बहुत परेशान है क्योंकि मुझे एक अज्ञात फ़ंक्शन के रूप में मेरी कार्रवाई में गुजरना है, और यदि संभव हो तो मैं मानक लॉकिंग तंत्र का उपयोग करना पसंद करूंगा ।क्या रीडरवाइटर लॉकस्लिम के लिए लॉक {} कथन का समतुल्य है?

void bool DoWithWriteLock(ReaderWriterLockSlim RWLock, int TimeOut, Action Fn) 
    { 
     bool holdingLock = false; 
     try 
     { 
      if (RWLock.TryEnterWriteLock(TimeOut)) 
      { 
       holdingLock = true; 
       Fn(); 
      } 
     } 
     finally 
     { 
      if (holdingLock) 
      { 
       RWLock.ExitWriteLock(); 
      } 
     } 
     return holdingLock; 
    } 
+1

* कोशिश * बयान गलत स्थान पर है। * कोशिश करें * TryEnterWriteLock() के बाद। एक चर के लिए और आवश्यकता नहीं है, एक शॉर्टकट व्यर्थ हो जाता है। ' –

उत्तर

14

आप lock कीवर्ड के व्यवहार को ओवरराइड नहीं कर सकते हैं। using कीवर्ड को हाइजैक करना एक आम तकनीक है।

  1. मेक लौट DoWithWriteLock एक IDisposable
  2. DoWithWriteLock विधि
  3. वापसी एक वस्तु है कि IDisposable लागू करता है अंदर TryEnterWriteLock कॉल रखें। उस ऑब्जेक्ट की Dispose विधि में, कॉल को ExitWriteLock पर रखें।

अंतिम परिणाम:

// Before 
DoWithWriteLock(rwLock, 
    delegate 
    { 
     Do1(); 
     Do2() 
    }); 

// After 
using (DoWithWriteLock(rwLock)) 
{ 
    Do1(); 
    Do2(); 
} 
+1

से पहले काफी बेहतर हो सकता है। क्या यह सच है कि यह एफ # में आसान होगा? – Andrey

+0

हाय टिम;' DoWithWriteLock (rwLock,() => {; Do2() Do1()}): – jonnii

+0

क्या टाइमआउट के साथ TryEnterWriteLock के लिए ऐसा करने का एक समान तरीका है? – Xodarap

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