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