क्या सी # में "लॉक करने का प्रयास करें, समय समाप्त हो गया है" ऑपरेशन है?

मुझे किसी ऑब्जेक्ट को लॉक करने का प्रयास करने की आवश्यकता है, और यदि यह पहले से ही लॉक हो गया है (केवल समय के बाद, या इसके बिना)।

सी # लॉक स्टेटमेंट अवरुद्ध है।

0
ro fr bn

5 उत्तर

एड के लिए आपके लिए सही काम है। बस Monitor.Exit() को कॉल करना न भूलें। उचित सफाई की गारंटी के लिए आपको try-finally ब्लॉक का उपयोग करना चाहिए।

if (Monitor.TryEnter(someObject))
{
    try
    {
       //use object
    }
    finally
    {
        Monitor.Exit(someObject);
    }
}
0
जोड़ा
@ceztko, क्या आप स्पष्टीकरण दे सकते हैं? आम तौर पर, एन संसाधनों को जारी करना, उदाहरण के लिए, सी # को एन नेस्टेड प्रयास-अंत में ब्लॉक की आवश्यकता होती है। उपयोग कथन केवल आईडीस्पोजेबल्स के लिए इससे बचने में मदद करता है। कोशिश-अंत में ब्लॉक को छोड़कर अपवाद की स्थिति में संसाधनों को लीक किया जा सकता है। उदाहरण के लिए, मॉनिटर दस्तावेज़ स्पष्टीकरण कि अंत में ब्लॉक आवश्यक है। आश्चर्यजनक रूप से, एड का लिंक इस पर उपेक्षा करता है।
जोड़ा लेखक Derek Park, स्रोत
+1, धन्यवाद! यदि आप चाहें तो थोड़ा बदलाव प्रस्तावित करें, केवल यादृच्छिक रूप से ब्रेसिज़ को बिना छेड़छाड़ किए बिना उन्नत संरचनाओं/पैटर्न का उपयोग करना हमेशा याद रखें।
जोड़ा लेखक ceztko, स्रोत

आपको शायद यह अब आपके लिए मिल जाएगा कि दूसरों ने आपको सही दिशा में इंगित किया है, लेकिन TryEnter भी टाइमआउट पैरामीटर ले सकता है।

जेफ रिक्टर की "सीएलआर वाया सी #" सीएलआर सराय के विवरण पर एक उत्कृष्ट पुस्तक है यदि आप अधिक जटिल चीजें प्राप्त कर रहे हैं।

0
जोड़ा

मेरा मानना ​​है कि आप < कोड> Monitor.TryEnter()

लॉक स्टेटमेंट सिर्फ Monitor.Enter() कॉल और पकड़ने का प्रयास करें ब्लॉक में अनुवाद करता है।

0
जोड़ा
अगर मैं इंटर-प्रोसेस कॉन्सुरेंसी से निपट रहा हूं तो क्या होगा? क्या एक मटेक्स का उपयोग इसी तरह से करने का कोई तरीका है?
जोड़ा लेखक Mihai Todor, स्रोत

मुझे एक ही समस्या थी, मैंने एक वर्ग <�कोड> TryLock बनाने का अंत किया जो IDISposable लागू करता है और फिर लॉक के दायरे को नियंत्रित करने के लिए कथन का उपयोग करता है:

public class TryLock : IDisposable
{
    private object locked;

    public bool HasLock { get; private set; }

    public TryLock(object obj)
    {
        if (Monitor.TryEnter(obj))
        {
            HasLock = true;
            locked = obj;
        }
    }

    public void Dispose()
    {
        if (HasLock)
        {
            Monitor.Exit(locked);
            locked = null;
            HasLock = false;
        }
    }
}

और फिर लॉक करने के लिए निम्न वाक्यविन्यास का उपयोग करें:

var obj = new object();

using (var tryLock = new TryLock(obj))
{
    if (tryLock.HasLock)
    {
        Console.WriteLine("Lock acquired..");
    }
}
0
जोड़ा

एक टाइमआउट इनपुट के साथ AutoResetEvent और इसकी विधि WaitOne का उपयोग करने पर विचार करें।

https://msdn देखें। microsoft.com/en-us/library/system.threading.autoresetevent(v=vs.110).aspx और https://msdn.microsoft.com/en-us/library/cc190477 (v = vs.110) .aspx

0
जोड़ा