هل هناك "محاولة قفل تخطي إذا انتهت مهلة" العملية في C# ؟
-
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