在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