如何在BackgroundWorker的DoWork事件中按百分比上报进度?进度值始终为0
问题原因与解决办法
问题原因
你的进度值始终为0,核心是数值运算的精度截断问题:
当filesl.Count为40000时,前399次循环中,(i+1)远小于总数,比如i+1=100时,(float)100/40000=0.0025,乘以100后仅为0.25,强制转换为int类型会直接截断小数部分,结果就是0。只有当i+1 >= 400时,(400*100)/40000=1,进度值才会变为1,这就导致前期进度始终显示为0。
修复方案
方案1:调整运算顺序,保留精度
把乘法运算提前,用double类型参与计算避免精度丢失,确保小数值能被正确转换:
int progress = (int)(((double)(i + 1) * 100) / filesl.Count);
如果需要四舍五入显示进度,可结合Math.Round:
int progress = (int)Math.Round(((double)(i + 1) * 100) / filesl.Count);
方案2:优化进度上报频率
没必要每次循环都上报进度,既浪费资源又看不到实际变化。可以只在进度值发生变化时上报:
int lastProgress = -1; for(int i = 0; i < filesl.Count; i++) { FileInfo info = new FileInfo(filesl[i]); dic.Add(filesl[i], info.Length); int progress = (int)(((double)(i + 1) * 100) / filesl.Count); if(progress != lastProgress) { worker.ReportProgress(progress, filesl[i]); lastProgress = progress; } Thread.Sleep(100); }
额外优化
File.Exists(info.FullName)判断多余,因为GetFiles返回的都是已存在的文件路径,可直接删除该判断。
内容的提问来源于stack exchange,提问作者Daniel Lip
相关产品推荐
相关产品推荐

