两个线程共享相同的AutoResetEvent对象,线程可以通过调用AutoResetEvent对象的WaitOne()方法进入等待状态,然后另外一个线程通过调用AutoResetEvent对象的Set()方法取消等待的状态。
AutoResetEvent如何工作的
在内存中保持着一个bool值,如果bool值为False,则使线程阻塞,反之,如果bool值为True,则使线程退出阻塞。当我们创建AutoResetEvent对象的实例时,我们在函数构造中传递默认的bool值,以下是实例化AutoResetEvent的例子。
AutoResetEvent autoResetEvent = new AutoResetEvent(false);
WaitOne 方法
该方法阻止当前线程继续执行,并使线程进入等待状态以获取其他线程发送的信号。WaitOne将当前线程置于一个休眠的线程状态。WaitOne方法收到信号后将返回True,否则将返回False。
autoResetEvent.WaitOne();
WaitOne方法的第二个重载版本是等待指定的秒数。如果在指定的秒数后,没有收到任何信号,那么后续代码将继续执行。
static void ThreadMethod()
{
while(!autoResetEvent.WaitOne(TimeSpan.FromSeconds(2)))
{
Console.WriteLine("Continue");
Thread.Sleep(TimeSpan.FromSeconds(1));
}
Console.WriteLine("Thread got signal");
}
这里我们传递了2秒钟作为WaitOne方法的参数。在While循环中,autoResetEvent对象等待2秒,然后继续执行。当线程取得信号,WaitOne返回为True,然后退出循环,打印"Thread got signal"的消息。
注意:AutoResetEvent可重复使用
初始化一个AutoResetEvent:AutoResetEvent resetEvent = new AutoResetEvent(false);
线程遇到resetEvent.WaitOne();
时,线程会阻塞住,等待其他线程的resetEvent.Set();
信号,然后从等待点继续向下执行。
线程执行resetEvent.Set();
后,resetEvent 的状态马上变成了false
,resetEvent.WaitOne();
会继续阻塞。
AutoResetEvent resetEvent = new AutoResetEvent(false);
Task.Run(() =>
{
while (true)
{
Thread.Sleep(1000*1);
Console.WriteLine("我执行的一次");
resetEvent.WaitOne();
}
});
Task.Run(() =>
{
while (true)
{
Thread.Sleep(1000*5);
Console.WriteLine("放行了一次");
resetEvent.Set();
}
});
Console.Read();