BackgroundWorker RunWorkerCompleted Event - PullRequest
26 голосов
/ 11 мая 2010

В моем приложении на C # есть несколько фоновых рабочих. Иногда один фоновый работник уволит другого. Когда первый фоновый работник завершает работу и запускается событие RunWorkerCompleted, в каком потоке будет запущено это событие, пользовательский интерфейс или первый фоновый работник, из которого был вызван RunWorkerAsync? Я использую Microsoft Visual C # 2008 Express Edition. Любые мысли или предложения, которые вы можете иметь, будут оценены. Спасибо.

1 Ответ

60 голосов
/ 11 мая 2010

Если BackgroundWorker было создано из потока пользовательского интерфейса, то событие RunWorkerCompleted также будет вызвано в потоке пользовательского интерфейса.

Если оно было создано из фонового потока, событие будет вызываться в неопределенном фоновом потоке (не обязательно в том же потоке, если вы не используете пользовательский SynchronizationContext).

Интересно, что это не очень хорошо документировано на MSDN. Лучшая ссылка, которую мне удалось найти, была здесь :

Предпочтительным способом реализации многопоточности в вашем приложении является использование компонента BackgroundWorker . Компонент BackgroundWorker использует управляемую событиями модель для многопоточности. Фоновый поток запускает ваш обработчик событий DoWork , а поток, который создает ваши элементы управления, запускает обработчики событий ProgressChanged и RunWorkerCompleted . вызовите свои элементы управления из ваших ProgressChanged и RunWorkerCompleted обработчиков событий.

...