Обновление ProgressBar в Windows Forms при использовании Parallel.ForEach

Пишу Windows Forms-приложение на C#. Нужно параллельно обработать большую коллекцию данных:

var items = GetData();
Parallel.ForEach(items, item => {
    ProcessItem(item);
});

Обработка может занимать от нескольких секунд до нескольких десятков минут, в зависимости от объёма. Хочу добавить на форму ProgressBar, который будет показывать примерный прогресс и оставшееся время.

Что пробовал: Обновлять progressBar.Value напрямую из тела Parallel.ForEach — получаю исключения о неверном потоке. Выносил логику в BackgroundWorker, но он не умеет из коробки распараллеливать.

Что нужно узнать:

  • Как правильно делегировать отчёты о прогрессе в UI-поток при параллельной обработке?
  • Как обеспечить потокобезопасность при инкременте счётчика обработанных элементов?
  • Как оптимально снизить нагрузку на UI при очень частых обновлениях?

Буду благодарен за пример кода и пояснения!


Ответы (0 шт):