Давайте спочатку обговоримо ManualResetEvent, а під час обговорення я додам трохи матеріалів AutoResetEvent для порівняння:
ManualResetEvent може блокувати один або кілька потоків до отримання сигналу, який повідомляє ManualResetEvent припинити блокування поточного потоку.
Інформація про ManualResetEvent
Уявіть, що об'єкт ManualResetEvent має булеву властивість типу IsRelease, яка контролює, чи блокувати поточний потік. Ми можемо встановити цю властивість під час ініціалізації, наприклад ManualResetEvent event=new ManualResetEvent(false); Це означає, що властивість за замовчуванням — блокувати поточний потік.
Приклад коду:
Зверніть увагу на важливу різницю між ManualResetEvent та AutoResetEvent тут:
Інструкція обов'язково надішле сигнал і на нитку 1, і на нитку 2,Авто надсилає сигнал лише одному з них випадково.
Чому один називається ручним, а інший — автоматичним? Я думаю, це питання, яке мають багато людей, і тепер ми розглянемо його питання.
Просто now_manualResetEvent. Set(); Я думаю, що всі розуміють це речення, яке можна розглядати як встановлення властивості IsRelease як істину
_manualResetEvent.WaitOne(); Більше не блокує потік 1 після отримання сигналу. Цінність IsRelease залишається актуальною протягом усього процесу після цього.Якщо
Якщо ви хочете повернути значення IsRelease у false значення, потрібно знову викликати метод _manualResetEvent.Reset().
Якщо це _autoResetEvent.set(), то _autoResetEvent.WaitOne() автоматично встановить значення IsRelease як false.
Ось чому один називається автоматичним, а інший — механічним.
Тестовий код:
|