У меня есть цикл Parallel.ForEach (), который берет список URL-адресов и загружает каждый из них для некоторой дополнительной обработки.Вне моего цикла я объявил переменную счетчика цикла, а внутри тела цикла я использую Interlocked.Increment (), думая, что это будет лучшим способом сохранить «потокобезопасный» способ увеличения числа при выполнении каждого взаимодействия цикла.
int counter = 0;
Parallel.ForEach(urlList, (url, state) =>
{
// various code statments
Interlocked.Increment( ref counter );
Debug.WriteLine(" ......... counter: " + counter);
});
Я бы подумал, что увижу что-то похожее на:
......... 1
......... 2
......... 3
......... 4
......... 5
.........
.........
......... n
Но вместо этого я получаю 16 "......... 0" (этопотому что у меня есть двухъядерный компьютер с 8 собственными ядрами, но включена поддержка многопоточности, что дает мне всего 16 ядер).Затем я начну видеть, что счетчик по большей части нормально увеличивается, но иногда я увижу дублированные или даже тройные значения счетчика в выходных данных отладки.
Использование Parallel.ForEach (), что является лучшим способомсчитать итерации цикла?Спасибо за любой совет.