هل هناك "محاولة قفل تخطي إذا انتهت مهلة" العملية في C# ؟

StackOverflow https://stackoverflow.com/questions/8546

  •  08-06-2019
  •  | 
  •  

سؤال

أنا بحاجة إلى محاولة قفل على كائن ، و إذا كان بالفعل مؤمنا الاستمرار فقط (بعد الوقت ، أو دون ذلك).

C# قفل البيان الحجب.

هل كانت مفيدة؟

المحلول

وأعتقد أنه يمكنك استخدام Monitor.TryEnter().

قفل البيان الذي يترجم إلى Monitor.Enter() دعوة try catch كتلة.

نصائح أخرى

إد حصلت على وظيفة لك.فقط لا تنسى أن تتصل Monitor.Exit().يجب عليك استخدام try-finally كتلة لضمان تنظيف.

if (Monitor.TryEnter(someObject))
{
    try
    {
        // use object
    }
    finally
    {
        Monitor.Exit(someObject);
    }
}

كان عندي نفس المشكلة, لقد انتهى إلى خلق فئة TryLock التي تطبق IDisposable ثم يستخدم using بيان السيطرة على نطاق القفل:

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..");
    }
}

ربما ستجد هذا لنفسك الآن أن البعض الآخر أشار في الاتجاه الصحيح ، ولكن TryEnter يمكن أيضا أن تأخذ مهلة المعلمة.

جيف ريختر "CLR عن طريق C#" هو كتاب ممتاز في تفاصيل CLR أحشاء إذا كنت تحصل عليه في الأشياء أكثر تعقيدا.

النظر في استخدام AutoResetEvent ومنهجه WaitOne مع مهلة الإدخال.

static AutoResetEvent autoEvent = new AutoResetEvent(true);
if(autoEvent.WaitOne(0))
{
    //start critical section
    Console.WriteLine("no other thread here, do your job");
    Thread.Sleep(5000);
    //end critical section
    autoEvent.Set();
}
else
{
    Console.WriteLine("A thread working already at this time.");
}

انظر https://msdn.microsoft.com/en-us/library/cc189907(v=مقابل 110).aspx https://msdn.microsoft.com/en-us/library/system.threading.autoresetevent(v=مقابل 110).aspx و https://msdn.microsoft.com/en-us/library/cc190477(v=مقابل 110).aspx

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top