我试图在网上找到这个代码段:
private EventWaitHandle wh = new AutoResetEvent();
private void WorkerThread()
{
while(true)
{
wh.WaitOne();
//Do work.
}
}
public void StartWorking()
{
wh.Set();
}
所以我理解线程一旦命中WaitOne()它就会阻塞直到调用Set(),但是如果多个线程到达.WaitOne()会怎样?他们都会被封锁还是只有一个?如果调用Set(),它会释放所有线程还是只释放一个?
编辑 - 我正在阅读更多并尝试它和后续问题:如果ManualResetEvent完成了我上面描述的内容,当有多个线程同时等待时,它的行为如何? AutoResetEvent只用一次Set()调用一次释放一个吗?
答案 0 :(得分:6)
AutoResetEvent
:在一个Set()
被调用后,只有一个线程会通过WaitOne()
;其他线程仍在等待第二个Set()
。
ManualResetEvent
:在调用一个Set()
后,线程将永久通过WaitOne()
,除非您手动调用Reset()
。