using System.Threading; namespace Curtain.Net.Sockets.PLC.ThreadLock { internal class WaiterThreadLock : IThreadLock { public bool Locked { get; private set; } private int _interlocke = 0; private readonly AutoResetEvent _waiterLock = new AutoResetEvent(false); public bool HasWaiter { get { return (_interlocke != 0); } } public void Dispose() { _waiterLock?.Close(); } public bool Lock(int timeout = -1) { if (Interlocked.Increment(ref _interlocke) == 1) { return Locked = true; } if (timeout < 0) { //_waiterLock.WaitOne(); return Locked = _waiterLock.WaitOne(); } else { return Locked = _waiterLock.WaitOne(timeout); } } public void Unlock() { if (Interlocked.Decrement(ref _interlocke) == 0) { Locked = false; return; } _waiterLock.Set(); Locked = false; } } }