如何获得 Parallel.ForEach 的完成百分比

How to get % of Parallel.ForEach completion

我有一些进程可以按顺序遍历一组大文件,并将它们的信息提取到 write\update 我们的数据库中。这些文件通常每个都有几千行,所以我构建了一个 Parallel.ForEach 来同时处理给定文件中的多行(由于需要按顺序应用每个文件,一次只处理一个文件)。现在我需要知道大约有多少当前文件已被处理,以便我可以向管理层提供剩余运行时间的指示。到目前为止我有以下

public void MyProcess(FileItem file)
{
    List<string> lines = file.GetLines(); //some process to get the lines to handle
    long cntr = 0; //The counter to track

    Parallel.ForEach(lines, crntLine =>
    {
       Console.Writeline(String.Format("Currently finished {0} out of {1} lines",cntr,lines.Count());
       InterLocked.Increment(ref cntr);

       //...Code to process crntLine here

    });
}

我根本不关心处理了哪些行,只关心总共处理了多少行,这样就可以回答它在当前文件中有多远的问题。这会可靠地提供我正在寻找的东西吗?

Interlocked.Increment 将作为原子操作安全地增加您的计数器。

但是,如果您想要计算行数 已完成,您需要在行处理之后而不是之前增加它:

public void MyProcess(FileItem file)
{
    List<string> lines = file.GetLines(); //some process to get the lines to handle
    long cntr = 0; //The counter to track

    Parallel.ForEach(lines, crntLine =>
    {
       //...Code to process crntLine here

       InterLocked.Increment(ref cntr);
       Console.Writeline(String.Format("Currently finished {0} out of {1} lines",cntr,lines.Count());
    });
}

如果你想要百分比,将完成的计数除以总计数,然后乘以 100:

double percentage = (double)cntr / lines.Count * 100