в каком потоке работает обработчик событий, завершенный backgroundworker? - PullRequest
9 голосов
/ 19 ноября 2010

У меня есть приложение с графическим интерфейсом, которое требует выполнения длинных вычислений (подумайте минуту или больше), и способ, которым он справляется с этим, заключается в передаче вычисления фоновому работнику. (эта часть в порядке)

У меня вопрос, если я сделаю что-то вроде: this.backgroundWorker.RunWorkerCompleted + = new System.ComponentModel.RunWorkerCompletedEventHandler (this.doSomethingElse);

Будет ли doSomethingElse запускаться в основном потоке пользовательского интерфейса или в пуле потоков, на котором работал фоновый работник?

спасибо за любую помощь, которую вы можете предоставить.

Ответы [ 3 ]

6 голосов
/ 19 ноября 2010

Он будет запущен в том же потоке, в котором находится BackgroundWorker, т.е. чаще всего в потоке пользовательского интерфейса.

5 голосов
/ 19 ноября 2010

doSomethingElse будет запущен в главном потоке пользовательского интерфейса

Да, это главная причина, по которой вы работаете в фоновом режиме. Он имеет 3 события, только DoWork будет выполняться в отдельном (ThreadPool) потоке. Завершено, и ProgressChanged будет маршалирован в основной поток.

4 голосов
/ 05 января 2012

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

Если он был создан из фонового потока, событие будет вызвано в неопределенном фоновом потоке.

См. Этот пост и эту проблему подключения для получения дополнительной информации.

https://stackoverflow.com/a/2806824/279999

http://connect.microsoft.com/VisualStudio/feedback/details/116930/backgroundworker-components-progresschanged-and-runworkercompleted-event-run-on-wrong-thread

...