в каком потоке запускается обработчик событий завершения backgroundworker?

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

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

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

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


person chuck taylor    schedule 18.11.2010    source источник
comment
Вы можете написать System.Threading.Thread.CurrentThread.ManagedThreadId в окно вывода в UI, DoWork и WorkCompleted, чтобы подтвердить   -  person PostMan    schedule 19.11.2010


Ответы (3)


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

person Homde    schedule 18.11.2010
comment
Хорошо для второй части, но Bgw (или любой другой объект) не находится «в потоке». - person Henk Holterman; 19.11.2010
comment
Извините, ветвь, породившая это, была бы лучшей формулировкой - person Homde; 19.11.2010
comment
На самом деле это поднимает интересный момент ... если вы используете визуальный дизайнер GUI в приложении форм Windows для объявления BackgroundWorker, будет ли фактический объект BackgroundWorker в стеке для потока пользовательского интерфейса или в куче? - person chuck taylor; 19.11.2010
comment
На самом деле имеет значение не поток, который создает bgw. Он каким-то образом найдет MessagePump через контекст выполнения. Или что-то вроде того. - person Henk Holterman; 19.11.2010
comment
Хотя это правда, я все же иногда обнаруживаю, что получаю межпоточные ошибки, показывая диалоговое окно или выполняя какие-либо действия с элементами управления пользовательского интерфейса внутри метода Completed (). Я чувствую, что мне все еще нужно проверить InvokeRequired и использовать Invoke () для элемента управления, чтобы убедиться. - person PandaWood; 10.02.2016

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

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

person Henk Holterman    schedule 18.11.2010

Если 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

person mjcopple    schedule 05.01.2012
comment
Верно! Первый раз меня смутил этот факт, когда мое приложение работало нормально, а событие Completed было вызвано из основного потока пользовательского интерфейса. Но мои модульные тесты завершились неудачно, поскольку событие Completed было вызвано из фонового потока, а не из основного тестового потока. - person Subtle Fox; 15.12.2014