我读了很多文章,说“Parallel.Foreach阻塞,直到完成所有迭代”。
在我的代码中并非如此 - 它开始做一些工作,然后在循环后执行代码,然后恢复。我做错什么了吗?
关于代码的作用的TLDR - 我有许多我想要处理的html页面。我一次从磁盘上读取它们并解析它们,然后显示一些有关我处理过的数据的统计信息。因此工作量是混合的 - 它同时进行IO和计算。
var parser = new Parser();
var processedCounter = 0;
var errorCount = 0;
Parallel.ForEach(files, new ParallelOptions() { MaxDegreeOfParallelism = 4 }, async file =>
{
using (var reader = File.OpenText(file))
{
var fileText = await reader.ReadToEndAsync();
try
{
var result = parser.ParseHtml(fileText);
//bookkeeping goes here
Interlocked.Increment(ref processedCounter);
if ((processedCounter + 1) % 10 == 0)
{
log.InfoFormat("passed {0} of {1}", processedCounter + 1, files.Length);
}
}
catch (Exception ex)
{
Interlocked.Increment(ref errorCount);
if ((errorCount + 1) % 10 == 0)
{
log.InfoFormat("error_report - {0} errors of {1} total", errorCount + 1, files.Length);
}
}
}
});
DisplayStats();