如何获得 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
我有一些进程可以按顺序遍历一组大文件,并将它们的信息提取到 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