2015-06-30 2 views
2

Я пытаюсь понять этот сегмент кода здесь я нашел в Интернете:Понимание нескольких потоков и EventWaitHandle

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()?

ответ

5

AutoResetEvent: после того, как один Set() назван, пройдет только одна нить WaitOne(); другие нити все еще ждут второго Set().

ManualResetEvent: после того, как один Set() называется, поток будет проходить WaitOne() навсегда, если вы вручную не звоните Reset().

+0

Спасибо за короткий и простой для понимания комментарий! Я просто боролся с ManualResetEvent и сразу использовал несколько потоков, когда увидел это. Задача решена! Большое спасибо :) – Ross