Нерест BackgroundWorkers - PullRequest
       7

Нерест BackgroundWorkers

2 голосов
/ 19 апреля 2010

У нас есть бизнес-кейс, который идеально подходит для нескольких BackgroundWorkers.

Например, у нас есть форма с кнопкой «Сохранить». Обычно мы выполняем все команды сохранения (например, «Сохранить») синхронно, а затем закрываем форму. Теперь мы хотели бы разделить работу на отдельные потоки, используя backgroundworker.

Мы перебираем каждое требуемое «Сохранить» (может быть много и / или различное количество команд, которые должны быть выполнены), создавая BackgroundWorker для каждой требуемой команды.

Вопрос в том ... как нам дождаться завершения ВСЕХ BackgroundWorkers, прежде чем закрыть форму. Мы понимаем, как ждать завершения одного BackgroundWorker, но когда у нас работает X фоновых рабочих, как нам ждать, пока все не будет завершено, прежде чем закрывать форму пользовательского интерфейса?

Ответы [ 2 ]

2 голосов
/ 19 апреля 2010

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

Поскольку событие Completed возникает в потоке пользовательского интерфейса, вам не нужно беспокоиться о безопасности потока.

0 голосов
/ 19 апреля 2010

Я бы рекомендовал использовать класс CountdownLatch, представленный в следующей (очень превосходной) статье в журнале MSDN Magazine:

9 Многоразовые параллельные структуры данных и алгоритмы

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

...