namespace Serein.DbSql { /// /// 线程阻塞 /// public class FifoManualResetEvent { private readonly object lockObj = new object(); /// /// 让线程按进入时间顺序调用 /// private readonly Queue waitQueue = new Queue(); private bool isSet; public bool IsSet { get => isSet; set => isSet = value; } public FifoManualResetEvent(bool initialState = false) { IsSet = initialState; } /// /// 等待解锁 /// public void Wait() { lock (lockObj) { if (IsSet) { // 获取到了发送的信号,线程开始重新执行 return; } var currentThread = Thread.CurrentThread; waitQueue.Enqueue(currentThread); while (!IsSet || waitQueue.Peek() != currentThread) { Monitor.Wait(lockObj); } waitQueue.Dequeue(); } } /// /// 发送信号 /// public void Set() { lock (lockObj) { IsSet = true; Monitor.PulseAll(lockObj); } } /// /// 锁定当前线程 /// public void Reset() { lock (lockObj) { IsSet = false; } } } }