为什么Parallel.Foreach在所有迭代完成之前都不会阻塞

时间:2016-07-08 13:35:44

标签: .net task-parallel-library

我读了很多文章,说“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();

0 个答案:

没有答案