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

C# 如何获得Parallel.ForEach完成的百分比,c#,multithreading,parallel.foreach,C#,Multithreading,Parallel.foreach,我有一个过程,它按顺序遍历一组大文件,并从中提取信息以写入\更新数据库。这些文件通常有几千行,因此我构建了Parallel.ForEach来同时处理给定文件中的多行(由于需要按顺序应用每个文件,所以一次只处理一个文件)。现在,我需要知道当前文件大约有多少已被处理,以便我可以向管理层提供剩余运行时的指示。到目前为止,我有以下几点 public void MyProcess(FileItem file) { List<string> lines = file.GetLines()

我有一个过程,它按顺序遍历一组大文件,并从中提取信息以写入\更新数据库。这些文件通常有几千行,因此我构建了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

    });
}
public void MyProcess(FileItem文件)
{
List lines=file.GetLines();//一些进程来获取要处理的行
long cntr=0;//要跟踪的计数器
Parallel.ForEach(行,crntLine=>
{
Writeline(String.Format(“当前完成了{1}行中的{0}”),cntr,lines.Count();
联锁增量(参考cntr);
//…在此处理crntLine的代码
});
}
我根本不关心处理了哪些行,只关心总共处理了多少行,这样就可以回答当前文件中有多远的问题。这是否能可靠地提供我要查找的内容?

将安全地将计数器作为原子操作递增

但是,如果要完成行数,则需要在行处理之后,而不是在以下时间之前,增加行数:

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());
    });
}
将安全地将计数器作为原子操作递增

但是,如果要完成行数,则需要在行处理之后,而不是在以下时间之前,增加行数:

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());
    });
}

似乎我在5分钟内无法接受答案,但这给了我所需要的。谢谢!我遇到了一个难题。我确实需要百分比,但当我按照您建议的方式执行时,答案似乎总是“0.00%”。下面是我使用的实际代码行
double percentDone=(lineCount/results.Count())*100;
发生了什么事?@Rocky这是
cntr*100/行。数一数
@Rocky的观点很好,我会把它添加到我的答案中。你应该只需要对其中一个numbers@Rabban执行整数除法时,运算顺序很重要,执行
cntr*100/行。Count
将给出与
cntr/行不同的结果。Count*100
因为当你用整数除以整数时,它会丢弃余数,所以你希望在*100之后而不是之前丢弃余数。但是你仍然得不到任何小数点,所以如果你想要小数部分,将其转换为双精度是更好的选择。看起来我在5分钟内无法接受答案,但这给了我什么t我需要。谢谢!我遇到了一个难题。我确实需要百分比,但当我按照您建议的方式执行时,答案似乎总是“0.00%”。下面是我使用的实际代码行
double percentDone=(lineCount/results.Count())*100;
发生了什么事?@Rocky这是
cntr*100/行。数一数
@Rocky的观点很好,我会把它添加到我的答案中。你应该只需要对其中一个numbers@Rabban执行整数除法时,运算顺序很重要,执行
cntr*100/行。Count
将给出与
cntr/行不同的结果。Count*100
因为当你将一个int除以一个int时,它会丢弃余数,所以你希望这个丢弃发生在*100之后,而不是之前。但是你仍然不会得到任何小数点,所以如果你想要小数部分,将其转换为double是更好的选择。