В моем приложении WPF - у меня есть ListView с Gridview внутри. Пользователь может добавлять файлы в этот список.
Вид сетки должен позволять мне иметь довольно богатые «строки», каждая строка отображает имя файла, дополнительную информацию о приложении и, что наиболее важно, индикатор выполнения. Каждая строка в виде сетки привязана к бизнес-объекту в коллекции, и, в частности, у объекта есть свойство «Progress», которое привязано к индикатору выполнения.
Мне нужно обрабатывать каждый файл, извлекать данные и отправлять данные в веб-службу, и я хотел бы отображать ход выполнения каждого файла в соответствующем индикаторе выполнения при работе с коллекцией файлов.
Первоначально я начал с простого цикла, содержащего логику обработки, которая периодически обновляла поле «Ход выполнения» для каждой строки, и отмечал, что интерфейс не обновлялся очень хорошо.
Затем я переместил логику обработки в цикле в BackgroundWorker, который изменил поле бизнес-объекта «Прогресс», и поскольку поток пользовательского интерфейса работал не так усердно - он был намного более отзывчивым.
Однако из-за асинхронной природы BackgroundWorker, он запускал несколько BackgroundWorkers (по одному для каждой строки) практически все сразу, когда цикл развернулся. Все мои индикаторы прогресса начали прогрессировать ...
Каков наилучший подход, чтобы ограничить его только 2-3 фоновыми работниками одновременно? Или даже оставить его в одном BackgroundWorker - и он не запустится, пока предыдущий не будет завершен? Как я могу ввести зависимость, чтобы по существу все BackgroundWorkers были синхронными?