在C#中有“尝试locking,跳过,如果超时”操作?
我需要尝试locking一个对象,如果它已经locking只是继续(超时,或没有它)。
C#locking语句阻塞。
我相信你可以使用Monitor.TryEnter()
。
locking语句只是转换为一个Monitor.Enter()
调用和一个try catch
块。
埃德对你有正确的function。 只要不要忘记调用Monitor.Exit()
。 你应该使用try-finally
块来保证正确的清理。
if (Monitor.TryEnter(someObject)) { try { // use object } finally { Monitor.Exit(someObject); } }
我有同样的问题,我最终创build了一个实现IDisposable的TryLock
类,然后使用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; } } }
然后使用以下语法来locking:
var obj = new object(); using (var tryLock = new TryLock(obj)) { if (tryLock.HasLock) { Console.WriteLine("Lock acquired.."); } }
现在你可能会发现,其他人已经指出你在正确的方向,但TryEnter也可以采取超时参数。
Jeff Richter的“CLR Via C#”是一本关于CLR内脏细节的优秀书籍,如果你正在进入更复杂的东西。
考虑使用超时inputAutoResetEvent及其方法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