Как я могу ждать BackgroundWorker? - PullRequest
2 голосов
/ 15 марта 2011

У меня есть метод Foo(), который создает и запускает BackgroundWorker.
RunWorkerCompleted, ProgressChanged и т. Д. Обрабатываются внутри Foo().

Мой главный поток вызывает MyObject.Foo().
Сразу после вызова MyObject.Foo() основной поток вызывает MyObject.DoSthWithFooData().

Главный поток ничего не знает о BackgroundWorker внутри MyObject.Foo().

Как заставить главный поток ждать, пока BackgroundWorker не завершит свою работу?

DoSthWithFooData() необходимо вызвать, когда BackgroundWorker in MyObject.Foo() завершит свою работу.

Ответы [ 4 ]

5 голосов
/ 15 марта 2011

Вы не хотите, чтобы основной поток ждал BackgroundWorker. Это может привести к тому, что ваш графический интерфейс перестанет отвечать на запросы, что не очень удобно для пользователя. Весь смысл использования BackgroundWorker в первую очередь состоит в том, чтобы не блокировать основной поток. Вместо этого вы должны зарегистрировать обработчик события для фонового работника RunWorkerCompleted. Код в обработчике событий будет запущен после завершения фоновой задачи.

Если вы хотите запретить пользователям взаимодействовать с программой во время выполнения фоновой задачи:

  • Отключите соответствующие элементы управления при запуске BackgroundWorker.
  • Снова включите их в обработчике событий RunWorkerCompleted.
2 голосов
/ 15 марта 2011

У вас есть два варианта:

  1. Вы можете полностью удалить BackgroundWorker и просто выполнить свой код синхронно. Если вы все равно заставите код ждать на BackgroundWorker, чтобы закончить, то это, по сути, то, что вы делаете. Это не лучший вариант, если предположить, что следующий вариант для вас практичен.
  2. Переместите логику, которая обычно следует за вызовом, в MyObject.Foo() в обработчик событий RunWorkerCompleted. Это является предпочтительным, так как он будет поддерживать «фоновый» элемент работы, а пользовательский интерфейс останется отзывчивым.
2 голосов
/ 15 марта 2011

положить DoSthWithFooData в RunWorkerCompleted Событие

0 голосов
/ 15 марта 2011

Дайте Foo () параметру callbacb делегат Action, который вызывается после выполнения foo. Затем вы можете использовать MenualResetEvent, чтобы дождаться завершения Foo.

, когда делегат Action вызывается сигнальным событием ManualReset

...