В моем приложении С# есть несколько фоновых работников. Иногда один фоновой работник увольняет другого. Когда первый работник фона завершается, а событие RunWorkerCompleted
запущено, на каком потоке будет происходить это событие, пользовательский интерфейс или первый фоновой рабочий, из которого был вызван RunWorkerAsync
? Я использую Microsoft Visual С# 2008 Express Edition. Любые мысли или предложения, которые у вас могут быть оценены. Спасибо.
BackgroundWorker RunWorkerCompleted Event
Ответ 1
Если BackgroundWorker
был создан из потока пользовательского интерфейса, событие RunWorkerCompleted
также будет поднято в потоке пользовательского интерфейса.
Если он был создан из фонового потока, событие будет поднято в фоновом потоке undefined (не обязательно тот же поток, если вы не используете пользовательский SynchronizationContext
).
Интересно, что это не все, что хорошо документировано в MSDN. Лучшая ссылка, которую я смог найти, была здесь:
Предпочтительным способом реализации многопоточности в вашем приложении является использование компонента BackgroundWorker. Компонент BackgroundWorker использует управляемую событиями модель для многопоточности. В фоновом потоке выполняется DoWork обработчик событий, а поток, создающий ваши элементы управления, запускает ProgressChanged и RunWorkerCompleted обработчики событий. Вы можете вызвать свои элементы управления из ProgressChanged и RunWorkerCompleted обработчики событий.