Давайте сначала обсудим ManualResetEvent, и я вставлю в обсуждение немного контента AutoResetEvent для сравнения:
ManualResetEvent может блокировать один или несколько потоков до тех пор, пока не поступит сигнал с предупреждением ManualResetEvent прекратить блокировку текущего потока.
Информация о ManualResetEvent
Представьте, что объект ManualResetEvent имеет булевое свойство типа IsRelease, чтобы контролировать, блокировать ли текущий поток. Мы можем задать это свойство при инициализации, например, ManualResetEvent event=new ManualResetEvent(false); Это указывает на то, что свойство по умолчанию — блокировать текущий поток.
Пример кода:
Обратите внимание на важное различие между ManualResetEvent и AutoResetEvent здесь:
Инструкция точно пошлёт сигнал как на Thread 1, так и на Thread 2,Автоматический сигнал отправляет только одному из них случайным образом.
Почему один называется ручным, а другой — автоматическим? Я думаю, это вопрос, который волнует многие, и теперь мы рассмотрим этот вопрос.
Просто now_manualResetEvent. Set(); Думаю, все понимают это предложение, которое можно рассматривать как утверждение свойства IsRelease на истинное
_manualResetEvent.WaitOne(); Больше не блокирует поток 1 после получения сигнала. Ценность IsRelease сохраняется на протяжении всего процесса после этого.Если
Если вы хотите вернуть значение IsRelease в false, нужно снова вызвать метод _manualResetEvent.Reset().
Если это _autoResetEvent.set(), то _autoResetEvent.WaitOne() автоматически установит значение IsRelease в false.
Вот почему один называется автоматическим, а другой — механическим.
Тестовый код:
|