2011-11-18 9 views
5

मैं उस कोड को देख रहा हूं जो बनाया गया है और यह एक विधि कॉल में TryEnter का उपयोग करता है और दूसरों में लॉक करता है। तो, इस तरह:मॉनीटर करता है। कोशिश करें और लॉक() एक साथ काम करते हैं?

private readonly object xmppLock = new object(); 

void f1() 
{ 
    if (Monitor.TryEnter(xmppLock)) 
    { 
     try 
     { 
      // Do stuff 
     } 
     finally 
     { 
      Monitor.Exit(xmppLock); 
     } 
    } 
} 

void f2() 
{ 
    lock(xmppLock) 
    { 
     // Do stuff 
    } 
} 

क्या यह ठीक है?

उत्तर

2

ताला को अवरुद्ध कर देगा जब तक संसाधन उपलब्ध है

TryEnter कुछ नहीं करेंगे, अगर वह पहले बंद है।

आपकी आवश्यकताओं के आधार पर आपको एक या दूसरे का उपयोग करना होगा।

आपके मामले में f2() हमेशा ऐसा करेगा जो इससे कोई फर्क नहीं पड़ता कि इससे कितना समय लगता है। f1() लॉक विवाद

+0

यह प्रश्न का उत्तर नहीं देता है, यह है कि ** एक ही ऑब्जेक्ट के साथ ** ** ** लॉक 'और' मॉनीटर। ट्राइंटर 'मिश्रण करना ठीक है या नहीं। [इस समान प्रश्न के उत्तर देखें] (https://stackoverflow.com/q/14377366/199364) – ToolmakerSteve

8

lockMonitor.Enter के लिए सिंटैक्स चीनी है, तो हाँ, यह ठीक काम करेगा।

The Visual Basic SyncLock and C# lock statements use Monitor.Enter to take the lock and Monitor.Exit to release it. The advantage of using the language statements is that everything in the lock or SyncLock block is included in a Try statement.

(जैसा कि कहा गया है, यह एक Type वस्तु की तरह कुछ सार्वजनिक पर लॉक करने के लिए खराब फार्म माना जाता है।)

+0

यह उत्तर नहीं देता ** TryEnter ** जो ओपी –

+0

का उपयोग करता है यह स्पष्ट है कि 'TryEnter' का उपयोग करके लॉक प्राप्त करना एक स्थान पर किसी अन्य स्थान पर 'एंटर' का उपयोग करके इसे प्राप्त करने के साथ मिलकर काम करना होगा, इसलिए यह आवास के लायक नहीं है। – mquander

4

हाँ इन दोनों निर्माणों साथ काम करेंगे। सी # lock कीवर्ड Monitor.Enter और Monitor.TryEnter विधियों पर केवल एक पतला आवरण है।

नोट: मैं लॉक करने के मान के रूप में Type उदाहरण का उपयोग करने से बिल्कुल बचना चाहूंगा। ऐसा करना बहुत नाजुक है क्योंकि यह कोड के दो पूरी तरह से असंबंधित टुकड़ों के लिए अप्रत्याशित रूप से उसी वस्तु पर लॉक होने के लिए बहुत आसान बनाता है। यह deadlocks के लिए नेतृत्व कर सकते हैं।

+0

टाइपऑफ() के बारे में सूचक के लिए धन्यवाद। मैंने इसके बारे में एक अलग सवाल पूछा था क्योंकि मुझे समझ में नहीं आया कि यह क्या कर रहा था क्योंकि यह मेरा कोड नहीं है और मैं यह सुनिश्चित करना चाहता था कि मुझे पता था कि क्या हो रहा था। – Firedragon

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