Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 了解多线程和EventWaitHandle_C#_Multithreading_Locking_Blocking - Fatal编程技术网

C# 了解多线程和EventWaitHandle

C# 了解多线程和EventWaitHandle,c#,multithreading,locking,blocking,C#,Multithreading,Locking,Blocking,我试图理解我在网上找到的代码段: private EventWaitHandle wh = new AutoResetEvent(); private void WorkerThread() { while(true) { wh.WaitOne(); //Do work. } } public void StartWorking() { wh.Set(); } 所以我知道线程一旦命中WaitOne(),它将阻塞,直到调用S

我试图理解我在网上找到的代码段:

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

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


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

谢谢您的简短易懂的评论!当我看到这个的时候,我正在和ManualResetEvent搏斗,让多个线程同时消耗它。问题解决了!非常感谢:)