Имеется список файловых путей. Над каждым файлом необходимо произвести определённое действие и увеличить счётчик, если это действие было выполнено успешно.
Для ускорения обработки списка файлов было решено использовать параллельный цикл. Обработка всего списка стала занимать достаточно малое время, но счётчик успешных операций стал выдавать странные значения.
К примеру, успешно обработано 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 раза больше, чем надо, либо одна итерация инкрементирует произвольное значение счётчику.
Помогите, пожалуйста, разобраться с данной проблемой.