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