BackgroundWorker: каждый ли метод, вызываемый из DoWorkEventHandler, запускается в фоновом потоке? - PullRequest
1 голос
/ 04 февраля 2011

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

Моя идея для решения этой проблемы состояла в использовании BackgroundWorker для обработки анализа. Но все ли методы, вызываемые из моего DoWorkEventHandle r, выполняются в фоновом потоке? Даже обработчики событий веб-клиентов?

Вся процедура синтаксического анализа происходит в DownloadStringCompletedEventHandler, поэтому было бы бесполезно, если бы он не работал в фоновом потоке.

Спасибо за вашу помощь, переполнение стека до сих пор было потрясающим :) Так держать!

Ответы [ 3 ]

4 голосов
/ 04 февраля 2011

Необходимо соблюдать осторожность при использовании компонентов EAP на основе событий из BackgroundWorker. В частности, если они создаются и запускаются методом BackgroundWorker.DoWork, они будут инициировать свои события в потоках ThreadPool, а не в потоке пользовательского интерфейса. В опубликованной вчера статье MSDN есть иллюстрация этой ситуации и объяснение, почему это происходит.

Если вы вызываете WebClient.DownloadStringAsync из BackgroundWorker.DoWork (который работает в потоке ThreadPool), то DownloadStringCompletedEventHandler будет выполняться в потоке ThreadPool. Однако это может быть поток , отличный от , чем поток BackgroundWorker; и BackgroundWorker может уже завершился к моменту начала DownloadStringCompletedEventHandler.

Итак, я бы не сказал, что он работает "в пределах" BackgroundWorker. Скорее, это действует в свободном потоке. Событие будет запущено в потоке ThreadPool, который может совпадать или не совпадать с потоком BackgroundWorker, а BackgroundWorker может завершиться или не завершиться при возникновении события.

Я думаю, что лучшее решение может состоять в том, чтобы WebClient оставался в собственности потока пользовательского интерфейса, и чтобы его обработчик событий сбросил BackgroundWorker. Таким образом, оба компонента EAP принадлежат потоку пользовательского интерфейса и будут работать так, как ожидается.

0 голосов
/ 04 февраля 2011

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

0 голосов
/ 04 февраля 2011

Да, насколько я понял, DoWorkEventHandler запускается в отдельном потоке. Также проверьте ThreadPool.QueueWorkItem и т. Д., Который может быть более простым процессом для вас.

...