В чем разница между ManualResetEvent и AutoResetEvent в .NET? - PullRequest
501 голосов
/ 30 сентября 2008

Я прочитал документацию по этому, и я думаю, что я понимаю. AutoResetEvent сбрасывается, когда код проходит через event.WaitOne(), а ManualResetEvent - нет.

Это правильно?

Ответы [ 11 ]

0 голосов
/ 19 апреля 2019

Если вы хотите понять AutoResetEvent и ManualResetEvent, вам нужно понимать не многопоточность, а прерывания!

.NET хочет вызвать низкоуровневое программирование как можно дальше.

Прерывания - это то, что используется в низкоуровневом программировании, что соответствует сигналу, который с низкого уровня стал высоким (или наоборот). Когда это происходит, программа прерывает нормальное выполнение и перемещает указатель выполнения на функцию, которая обрабатывает это событие .

Первое, что нужно сделать, когда случайное прерывание должно сбросить его состояние, потому что аппаратное обеспечение работает следующим образом:

  1. контакт подключен к сигналу, и аппаратное обеспечение ожидает его изменения (сигнал может иметь только два состояния).
  2. если изменение сигнала означает, что что-то произошло, и аппаратное обеспечение поместило переменную памяти в состояние (и оно останется таким, даже если сигнал снова изменится).
  3. программа замечает, что переменные изменяют состояния и переводит выполнение в функцию обработки.
  4. здесь первое, что нужно сделать, чтобы снова прослушать это прерывание, это сбросить эту переменную памяти в состояние не произошло.

В этом разница между ManualResetEvent и AutoResetEvent.
Если происходит событие ManualResetEvent, и я не сбрасываю его, в следующий раз, когда это произойдет, я не смогу его прослушать.

...