我遇到的情况是我使用ArrayList来存储文件名列表(完整文件路径)。当我向数组添加同一文件的多个项目时,使用ArrayList.IndexOf查找索引(我向BackgroundWorker报告进度),它总是返回第一个项目的索引,因为它按文件名搜索。这会导致进度条出现问题,即我正在处理3个文件,完成后,该条仅为1/3满。
以下是一些示例代码(我只是在这里添加项目,但在实际代码中它们是从ListBox添加的):
ArrayList list = new ArrayList();
list.Add("C:\Test\TestFile1.txt");
list.Add("C:\Test\TestFile1.txt");
list.Add("C:\Test\TestFile1.txt");
var files = list;
foreach (string file in files)
backgroundWorker1.ReportProgress(files.IndexOf(file) + 1);
当运行时,仅报告1“百分比”的进度,因为IndexOf每次都找到相同的文件。有没有办法解决?或者是否有人建议以另一种方式获取索引(或每个项目的任何唯一标识符)?
答案 0 :(得分:7)
最简单的方法就是使用索引进行迭代:
for (int i = 0; i < list.Count; i++)
{
backgroundWorks.ReportProgress(i + 1);
// Do stuff with list[i]
}
答案 1 :(得分:1)
为了达到你想要的效果,我建议使用for
列表。您不必搜索任何索引,并可以轻松地向backgroundWorker1
报告进度:
for (int counter = 0; counter < files.Count; counter++)
{
backgroundWorker1.ReportProgress(counter + 1);
}
通过这样做,您不会遇到相同文件名的问题。
这与foreach
相同:
int counter = 1;
foreach (string file in files)
{
backgroundWorker1.ReportProgress(counter);
counter++;
}
但我认为在这种情况下使用for
会更好。
答案 2 :(得分:0)
您可以制作列表的副本,然后在处理时从中删除每个项目。然后,您可以将完成百分比作为临时列表计数除以原始列表计数的函数返回。
每次后台工作者处理文件时都可以添加到int中,并使用该int来跟踪进度(完成百分比应该是int除以文件数)。
当然,无论采用哪种方法,您都需要确保以线程安全的方式修改相关变量。
答案 3 :(得分:0)
试试这个,如果你读取的文件有这么多行,它对我来说很好。
int percentage = (int)((count / (double)lineCount) * 100.0);
backgroundWorker5.ReportProgress(percentage);
此处count是总计数,linecount是当前运行计数。通过使用二者,计算百分比。将此代码保留在for循环或while循环中。
答案 4 :(得分:0)
假设进度条最大值为100,并且处理了三个文件中的一个文件应显示33(%)进度,您可以计算每个处理文件的进度并重新计算总体进度:
// list contains x file paths
var files = list;
double progressStep = 1 / files.Count;
for(int i = 0; i < files.Count; i++)
{
backgroundWorker1.ReportProgress((i + 1) * progressStep);
...
}
剩下的就是将后台工作人员的进度值分配给进度条。