Хорошо, это была моя ошибка, чтобы понять, как работает autoresetevent.
Перед запуском цикла в фоновом рабочем режиме я все равно должен AE.Reset . Это означает, что следующее WaitOne заставит рабочего спать.
В цикле я должен ReportProgress как обычно, за которым следует WaitOne . WaitOne заставляет рабочего спать, но только если AE был Reset . Если AE был Set , рабочий продолжит как обычно.
В событии ProgressChanged я должен обновить обычные элементы управления графическим интерфейсом, а затем AE.Set , чтобы разрешить спящему рабочему в состоянии WaitOne продолжить.
Если по какой-либо причине AE.WaitOne выполняется ПОСЛЕ AE.Set , работник ничего не ждет.
Наконец, ожидал ли работник или нет, AE автоматически сбрасывается, что означает, что WaitOne снова будет спать.
В основном ...
Выполнение Сброс вызывает следующий WaitOne для сна.
Выполнение Set освобождает поток в WaitOne .
Если в WaitOne ничего не установлено, Set немедленно освобождает NEXT WaitOne .
Выполнение WaitOne автоматически Сброс .
Все немного сбивает с толку, и документация не самая лучшая. Но я понял.
Я буду придерживаться фонового работника, потому что, на мой взгляд, это гораздо более простые задачи.