You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 15:31:05