了解多个线程和EventWaitHandle

Pip*_*ine 2 c# multithreading locking blocking

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

private EventWaitHandle wh = new AutoResetEvent();

private void WorkerThread() 
{
    while(true) 
    {
        wh.WaitOne();
        //Do work.
    }
}

public void StartWorking()
{
    wh.Set();
}
Run Code Online (Sandbox Code Playgroud)

所以我理解线程一旦命中WaitOne()它将阻塞直到调用Set(),但是如果多个线程到达.WaitOne()会怎么样?他们都会被封锁还是只有一个?如果调用Set(),它会释放所有线程还是只释放一个?

编辑 - 我正在阅读更多并尝试它和一个后续问题:如果ManualResetEvent完成了我上面描述的内容,当有多个线程同时等待时它的行为如何?只有一个Set()调用,AutoResetEvent会一次释放一个吗?

Col*_*ler 6

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

ManualResetEvent:一次Set()调用后,线程将WaitOne()永远传递,除非你手动调用Reset().