2009-08-19 20 views
45

वहाँ अगर एक वस्तु सी # में लॉक हो गया है निर्धारित करने के लिए कोई तरीका है? मैं डिजाइन जहां मैं एक वर्ग के अंदर एक कतार से पढ़ रहा हूँ के माध्यम से अवांछनीय स्थिति है, और मैं कक्षा में एक संग्रह में सामग्री डंप की जरूरत है। लेकिन वह संग्रह कक्षा के बाहर एक इंटरफेस से भी पढ़ा/लिखता है। तो जाहिर है कि एक मामला हो सकता है जब संग्रह लिखा जा रहा है, साथ ही साथ मैं इसे लिखना चाहता हूं।क्या कोई ऑब्जेक्ट लॉक होने का पता लगाने का कोई तरीका है?

मैं इसे दौर कार्यक्रम सकता है, प्रतिनिधि का उपयोग करते हुए कहते हैं कि लेकिन यह बदसूरत हो जाएगा।

+0

हाँ, धन्यवाद लोगों के बाद उपलब्ध है। यह काफी पुष्टि करता है कि मैंने पहले क्या सोचा था। –

उत्तर

40

तुम हमेशा प्रतीक्षा करने के लिए मूल्य के लिए 0 मान का उपयोग Monitor class पर स्थिर TryEnter method कॉल कर सकते हैं। अगर यह बंद है, तो कॉल झूठी वापसी होगी।

हालांकि, यहां समस्या यह है कि आपको यह सुनिश्चित करने की आवश्यकता है कि जिस एक्सेस को आप सिंक्रनाइज़ करने का प्रयास कर रहे हैं उसे एक्सेस सिंक्रनाइज़ करने के लिए स्वयं लॉक किया जा रहा है।

ऑब्जेक्ट का उपयोग करने के लिए यह आमतौर पर खराब अभ्यास है कि ऑब्जेक्ट को लॉक करने के लिए ऑब्जेक्ट सिंक्रनाइज़ किया जा रहा है (किसी ऑब्जेक्ट के आंतरिक विवरण का खुलासा करना)।

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

10

Monitor.TryEnter सफल होगा, और अवास्तविक लौटाते हैं, तो यह बहुत ही पल में, वस्तु बंद है। हालांकि, ध्यान दें कि यहां एक निहित दौड़ है: इस विधि का उदाहरण लौटाता है, ऑब्जेक्ट को और लॉक नहीं किया जा सकता है।

6

वर्तमान में आप मॉनीटर को कॉल कर सकते हैं। यह जांचने के लिए कि ऑब्जेक्ट लॉक है या नहीं।

ताला निरीक्षण
हम जोड़ रहे हैं कुछ सरल एपीआई:

.NET 4.0 CLR टीम में "लॉक निरीक्षण एपीआई"

यहाँ जोड़ने जा रहा है Rick Byers लेख से एक उद्धरण है ICorDebug को जो आपको प्रबंधित ताले (मॉनीटर) का पता लगाने की अनुमति देता है। उदाहरण के लिए, यदि कोई थ्रेड लॉक की प्रतीक्षा कर रहा है, तो आप पा सकते हैं कि वर्तमान में कौन सा थ्रेड लॉक हो रहा है (और यदि टाइम-आउट है)।
1) क्या वस्तु एक ताला रखा है:

तो, यह एपीआई के साथ जांच करने के लिए सक्षम हो जाएगा?
2) यह किसके लिए इंतज़ार कर रहा है?

उम्मीद है कि इससे मदद मिलती है।

+0

दिलचस्प। बॉब। –

7

मुझे यकीन नहीं है कि 0 के समय के साथ TryEnter के लिए एक स्थिर कॉल गारंटी देगा कि लॉक उपलब्ध नहीं होने पर हासिल नहीं किया जाएगा। समाधान मैं डिबग मोड में परीक्षण करने के लिए किया था कि सिंक चर का उपयोग कर रहा था निम्नलिखित ताला लगा हुआ था:

#if DEBUG 
// Make sure we're inside a lock of the SyncRoot by trying to lock it. 
// If we're able to lock it, that means that it wasn't locked in the first 
// place. Afterwards, we release the lock if we had obtained it. 
bool acquired = false; 
try 
{ 
    acquired = Monitor.TryEnter(SyncRoot); 
} 
finally 
{ 
    if (acquired) 
    { 
     Monitor.Exit(SyncRoot); 
    } 
} 
Debug.Assert(acquired == false, "The SyncRoot is not locked."); 
#endif 
+2

परिवर्तनीय 'isNotLocked' को बदनाम नाम दिया गया है। अगर अनलॉक किया गया है तो अनलॉक करें - तकनीकी रूप से यह सही है क्योंकि लॉक सफलतापूर्वक प्राप्त होने पर 'isNotLocked' सत्य नहीं होगा, उपरोक्त कोड पढ़ने के लिए वास्तव में खराब है। अगर किसी और को इस पर काम करना है तो उसे डब्ल्यूटीएफ पल होगा। – ChrisWue

+2

काम नहीं करता है अगर यह थ्रेड चल रहा है तो वह थ्रेड है जो लॉक का मालिक है। यह कहेंगे कि वास्तव में यह नहीं है जब ताला मुक्त है। –

4

Monitor.IsEntered

तय करता है कि वर्तमान धागा निर्दिष्ट वस्तु पर ताला आयोजित करता है।
4.5

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

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