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