我需要尝试锁定一个对象,如果它已经锁定只是继续(超时后,或没有它).
C#lock语句是阻塞的.
Ed为您提供了正确的功能.只是别忘了打电话Monitor.Exit()
.你应该使用一个try-finally
块来保证正确的清理.
if (Monitor.TryEnter(someObject)) { try { // use object } finally { Monitor.Exit(someObject); } }
我相信你可以使用Monitor.TryEnter()
.
lock语句只转换为Monitor.Enter()
调用和try catch
块.
我有同样的问题,我最终创建了一个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.."); } }