Как отправить прогресс при использовании Parallel.ForEach - PullRequest
4 голосов
/ 02 февраля 2011

Я планирую использовать Parallel.ForEach для DataTable, чтобы каждая запись могла быть записана в файл.

Как мы можем уведомить пользователя о проценте / количестве обработанных записей.

Обычно, когда мы используем Фоновый рабочий, у нас возникает событие ProgressChanged, где пользователь получает уведомление о проценте выполненной работы.Как мы можем достичь этого, используя Parallel.ForEach или несколько задач?

Спасибо, Банни

Ответы [ 2 ]

2 голосов
/ 02 февраля 2011

Вам понадобится (общий) счетчик, который начинается с 0 и который вы увеличиваете (с блокировкой) на конце каждой части.

А потом тебе нужно

  1. вызывает событие, и событие должно использовать Invoke (или Dispatch)
  2. или иметь таймер, периодически проверяющий счетчик

Вариант 2) проще и намного эффективнее, когда число итераций велико.

2 голосов
/ 02 февраля 2011

У меня была похожая проблема. Чтобы решить эту проблему, мы использовали Interlocked.Increment для числа, которое было видно всем потокам и интерфейсу пользователя и отображало индикатор выполнения, основанный на этом.

EDIT: обратите внимание, что если ваш счетчик long, вам нужно будет использовать Interlocked.Read, чтобы прочитать его. если вы используете int, процесс уже атомарный.

...