2010-10-06 2 views
11

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

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

ответ

9

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

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

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

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

4

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

Смежные вопросы