Ответ 1
Как предлагает SLaks, вы должны просто увеличить значение индикатора выполнения, а не устанавливать его в текущий индекс, полученный из метода Parallel.For
.
Тем не менее, я бы серьезно подумал об использовании более дешевого способа, чем отправка сообщения в поток пользовательского интерфейса с каждой итерацией. Если у вас много итераций, отправка сообщения с каждой итерацией может быть довольно сложной. Вы можете объявить локальную переменную count
и использовать Interlocked.Increment
, чтобы безопасно увеличивать эту переменную в теле параллельного цикла.
-
Затем вы можете использовать что-то вроде
if (count % 10 == 0) // ...
для обновления GUI только после 10 итераций. (Это не совсем корректно, так как другие потоки могут обновлятьcount
перед проверкой, но если это просто для получения значка GUI, то это не имеет значения - вы определенно не хотите использоватьlock
в теле цикла). -
В качестве альтернативы вы можете создать таймер, который будет многократно проверять значение
count
в потоке графического интерфейса пользователя и обновлять индикатор выполнения. Это, возможно, еще проще, и вы можете гарантировать, что индикатор выполнения будет обновляться достаточно часто, но не более.