| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
-
- 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;
- }
- }
- }
|