Могу ли я использовать несколько фоновых работ синхронно в WPF? - PullRequest
4 голосов
/ 30 мая 2011

В моем приложении WPF - у меня есть ListView с Gridview внутри. Пользователь может добавлять файлы в этот список.

Вид сетки должен позволять мне иметь довольно богатые «строки», каждая строка отображает имя файла, дополнительную информацию о приложении и, что наиболее важно, индикатор выполнения. Каждая строка в виде сетки привязана к бизнес-объекту в коллекции, и, в частности, у объекта есть свойство «Progress», которое привязано к индикатору выполнения.

Мне нужно обрабатывать каждый файл, извлекать данные и отправлять данные в веб-службу, и я хотел бы отображать ход выполнения каждого файла в соответствующем индикаторе выполнения при работе с коллекцией файлов.

Первоначально я начал с простого цикла, содержащего логику обработки, которая периодически обновляла поле «Ход выполнения» для каждой строки, и отмечал, что интерфейс не обновлялся очень хорошо.

Затем я переместил логику обработки в цикле в BackgroundWorker, который изменил поле бизнес-объекта «Прогресс», и поскольку поток пользовательского интерфейса работал не так усердно - он был намного более отзывчивым.

Однако из-за асинхронной природы BackgroundWorker, он запускал несколько BackgroundWorkers (по одному для каждой строки) практически все сразу, когда цикл развернулся. Все мои индикаторы прогресса начали прогрессировать ...

Каков наилучший подход, чтобы ограничить его только 2-3 фоновыми работниками одновременно? Или даже оставить его в одном BackgroundWorker - и он не запустится, пока предыдущий не будет завершен? Как я могу ввести зависимость, чтобы по существу все BackgroundWorkers были синхронными?

Ответы [ 2 ]

7 голосов
/ 30 мая 2011

Для этого вы можете использовать класс Task , как в примере здесь

2 голосов
/ 30 мая 2011

Если вы действительно хотите, чтобы одновременно выполнялся только один, есть несколько подходов.Вы можете использовать класс Task и TaskScheduler, например, @oleksii, предложенный в его ответе, или вы можете публиковать рабочие элементы в очереди и заставлять фоновый поток работать один за другим.

Но если все, что вам нужно, эточтобы сделать работу наиболее оптимальным способом, в зависимости от текущего оборудования, на котором работает ваша программа, я бы сказал, оставьте его планировщику заданий по умолчанию.Просто вызовите StartNew в TaskFactory всякий раз, когда вы хотите выполнить работу для строки сетки, и оставьте планирование на .NET.

Если у вас есть зависимости между задачами, вы можете использовать одну из перегрузок ContinueWith для поддержания порядка между заданиями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...