了解多个线程和EventWaitHandle

时间:2015-06-30 04:06:07

标签: c# multithreading locking blocking

我试图在网上找到这个代码段:

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()调用一次释放一个吗?

1 个答案:

答案 0 :(得分:6)

AutoResetEvent:在一个Set()被调用后,只有一个线程会通过WaitOne();其他线程仍在等待第二个Set()

ManualResetEvent:在调用一个Set()后,线程将永久通过WaitOne(),除非您手动调用Reset()