Dyaminigo
@Dyaminigo
.NET Developer

Как вести счётчик успешных операций, используя Parallel.ForEach?

Имеется список файловых путей. Над каждым файлом необходимо произвести определённое действие и увеличить счётчик, если это действие было выполнено успешно.
Для ускорения обработки списка файлов было решено использовать параллельный цикл. Обработка всего списка стала занимать достаточно малое время, но счётчик успешных операций стал выдавать странные значения.
К примеру, успешно обработано 250 файлов, а счётчик показывает 510. Блокировка инкрементации переменной оператором lock не спасает, а получить точное кол-во успешных операций крайне необходимо. Подскажите, пожалуйста, как можно точно подсчитать кол-во выполненых операций, используя параллельный цикл Parallel.ForEach?
Ниже привожу код-прототип требуемой задачи:
IEnumerable<string> files = new IEnumerable<string>();
files = Directory.EnumerateFiles(@"C:\test"); // +1300 путей к файлам
int successCounter = 0;
object _lock = new object();
Parallel.ForEach(files, f =>
{
if(Operation(f))
{
lock(_lock)
successCounter++;
}
});
Console.WriteLine($"Обработано: {successCounter.ToString()} из {files.Count().ToString()} файлов.");

successCounter в данном случае может быть: 2697, 2606, 2631. Но никогда около истинного кол-ва файлов - 1300. Такое чувство, что: либо параллельных итераций в 2 раза больше, чем надо, либо одна итерация инкрементирует произвольное значение счётчику.
Помогите, пожалуйста, разобраться с данной проблемой.
  • Вопрос задан
  • 120 просмотров
Решения вопроса 1
petermzg
@petermzg
Самый лучший программист
private volatile int counter;
Interlocked.Increment(ref counter);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы