Необходимо соблюдать осторожность при использовании компонентов EAP на основе событий из BackgroundWorker
. В частности, если они создаются и запускаются методом BackgroundWorker.DoWork
, они будут инициировать свои события в потоках ThreadPool
, а не в потоке пользовательского интерфейса. В опубликованной вчера статье MSDN есть иллюстрация этой ситуации и объяснение, почему это происходит.
Если вы вызываете WebClient.DownloadStringAsync
из BackgroundWorker.DoWork
(который работает в потоке ThreadPool
), то DownloadStringCompletedEventHandler
будет выполняться в потоке ThreadPool
. Однако это может быть поток , отличный от , чем поток BackgroundWorker
; и BackgroundWorker
может уже завершился к моменту начала DownloadStringCompletedEventHandler
.
Итак, я бы не сказал, что он работает "в пределах" BackgroundWorker
. Скорее, это действует в свободном потоке. Событие будет запущено в потоке ThreadPool
, который может совпадать или не совпадать с потоком BackgroundWorker
, а BackgroundWorker
может завершиться или не завершиться при возникновении события.
Я думаю, что лучшее решение может состоять в том, чтобы WebClient
оставался в собственности потока пользовательского интерфейса, и чтобы его обработчик событий сбросил BackgroundWorker
. Таким образом, оба компонента EAP принадлежат потоку пользовательского интерфейса и будут работать так, как ожидается.