Подтвердить что ты не робот

Отслеживайте прогресс при использовании Parallel.ForEach

Я реорганизую свою программу на использование Parallel.ForEach. Раньше, когда я использовал регулярный цикл, я обновлял индикатор выполнения WPF с помощью Dispatcher, отображая% завершенную делением текущего индекса массива на размер массива. При параллельном цикле foreach это не отображается должным образом, т.е.% Перескакивает, что ожидается.

Как обновить индикатор выполнения WPF от параллели для каждого цикла, чтобы я мог отслеживать количество завершенных итераций?

4b9b3361

Ответ 1

Как предлагает SLaks, вы должны просто увеличить значение индикатора выполнения, а не устанавливать его в текущий индекс, полученный из метода Parallel.For.

Тем не менее, я бы серьезно подумал об использовании более дешевого способа, чем отправка сообщения в поток пользовательского интерфейса с каждой итерацией. Если у вас много итераций, отправка сообщения с каждой итерацией может быть довольно сложной. Вы можете объявить локальную переменную count и использовать Interlocked.Increment, чтобы безопасно увеличивать эту переменную в теле параллельного цикла.

  • Затем вы можете использовать что-то вроде if (count % 10 == 0) // ... для обновления GUI только после 10 итераций. (Это не совсем корректно, так как другие потоки могут обновлять count перед проверкой, но если это просто для получения значка GUI, то это не имеет значения - вы определенно не хотите использовать lock в теле цикла).

  • В качестве альтернативы вы можете создать таймер, который будет многократно проверять значение count в потоке графического интерфейса пользователя и обновлять индикатор выполнения. Это, возможно, еще проще, и вы можете гарантировать, что индикатор выполнения будет обновляться достаточно часто, но не более.

Ответ 2

Каждый раз, когда вы завершаете операцию, вы должны отправлять сообщение в поток пользовательского интерфейса (вызывая Dispatcher.BeginInvoke, который увеличивает индикатор выполнения на 1.