Обновление 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 при очень частых обновлениях?
Буду благодарен за пример кода и пояснения!