2011-05-30 4 views
7

मैं चाहता हूं कि - अस्पष्ट कारणों से आप सवाल नहीं करेंगे - एक विधि में लॉक शुरू करें, और इसे दूसरे में समाप्त करें। किसी भी तरह की तरह है:विभिन्न विधियों में लॉक प्रारंभ करें और समाप्त करें

object mutex = new object(); 

void Main(string[] args) 
{ 
    Foo(); 
    doThings(); 
    Bar(); 
} 

void Foo() 
{ 
    startLock(mutex); 
} 

void Bar() 
{ 
    endlock(mutex); 
} 

समस्या यह है कि ताला कीवर्ड, एक ब्लॉक वाक्य रचना में काम करता है निश्चित रूप से है:

object mutex = new object(); 

void Main(string[] args) 
{ 
    lock (mutex) 
    { 
     doThings(); 
    } 
} 

समान व्यवहार रूप में होगा। मुझे पता है कि ताले इस तरह इस्तेमाल नहीं किए जाने वाले हैं, लेकिन मैं एस/ओ के रचनात्मक और हैकी समाधान के लिए खुले से अधिक हूं। :)

+1

। आप नीचे उतरने की तलाश में हैं? एक खराब स्वर सेट करता है। – Oded

+5

@ ओडेड: मैं एक विनोदी स्वर की तलाश में था, क्षमा करें। मैं बस अच्छे डिजाइन पर वार्तालापों से बचना चाहता हूं, क्योंकि मुझे पता है कि यह नहीं है, और इस तथ्य के बारे में पूरी तरह से अवगत हूं। मैं रचनात्मक समाधान और हैक देखना चाहूंगा, यही कारण है कि सवाल 'हैक्स' के साथ टैग किया गया था। – Lazlo

+0

मैं यहां हास्य का उपयोग करने वाले लोगों के साथ ठीक हूं, लेकिन "आप सवाल नहीं करेंगे" बस एक बंद डालने और elitist लगता है। – Oded

उत्तर

16
private readonly object syncRoot = new object(); 

void Main(string[] args) 
{ 
    Foo(); 
    doThings(); 
    Bar(); 
} 

void Foo() 
{ 
    Monitor.Enter(syncRoot); 
} 

void Bar() 
{ 
    Monitor.Exit(syncRoot); 
} 

[संपादित]

जब आप lock उपयोग करते हैं, यह है कि क्या .NET 4 में हुड के नीचे हो रहा है:

bool lockTaken = false; 
try 
{ 
    Monitor.Enter(syncRoot, ref lockTaken); 

    // code inside of lock 
} 
finally 
{ 
    if (lockTaken) 
     Monitor.Exit(_myObject); 
}  
"अस्पष्ट कारणों तू सवाल नहीं करेगा"
+0

अच्छा, यह अपेक्षा से कहीं अधिक आसान था। – Lazlo

+0

http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx: "ब्लॉक 'की शुरुआत में' लॉक 'कीवर्ड' एंटर 'कॉल करता है और ब्लॉक के अंत में' बाहर निकलें ' । " – trutheality

+0

'लॉक' कथन 'मॉनिटर' के लिए सिंटैक्टिक चीनी है। अंत में (x) कोशिश करें {/ * work * /} अंत में {Monitor.Exit (x)} '। –