为什么进度条显示从结束到开始倒计时的进度

本文关键字:开始 倒计时 显示 为什么 结束 | 更新日期: 2023-09-27 18:34:53

int countUploadMsg = 0;
private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
{
    int counter = 0;
    allLoadedMessages = new List<OpenPop.Mime.Message>();
    OpenPop.Mime.Message loadedMessage = null;
    DirectoryInfo di = new DirectoryInfo(@"e:'test'");
    FileInfo[] files = di.GetFiles();
    foreach (FileInfo file in files)
    {
        loadedMessage = OpenPop.Mime.Message.Load(file);
        allLoadedMessages.Add(loadedMessage);
        int nProgress = (files.Length - counter + 1) * 100 / files.Length;
        backgroundWorker2.ReportProgress(nProgress);
        counter += 1;
    }
}
private void backgroundWorker2_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    pbt1.Value = e.ProgressPercentage;
    pbt1.Text = e.ProgressPercentage.ToString() + "%";
    pbt1.Invalidate();
    lvnf.Items.Add(new ListViewItem(new string[]
    {
      allLoadedMessages[countUploadMsg].Headers.From.ToString(),         //From Column
      allLoadedMessages[countUploadMsg].Headers.Subject,                 //Subject Column
      allLoadedMessages[countUploadMsg].Headers.DateSent.ToString()      //Date Column
    }));
    countUploadMsg += 1;
}

变量pbt1ProgressBar

我看到的是 100% 的ProgressBar绿色,文本也是 100%,然后它开始向后移动绿色和文本 100% 99% 98%....

也许我正在做的计算有些事情:

int nProgress = (files.Length - counter + 1) * 100 / files.Length;

而且files.Length也应该files.Length-1

为什么进度条显示从结束到开始倒计时的进度

是的,你做对了。这是你的计算。

int nProgress = (files.Length - counter + 1) * 100 / files.Length;

你的counter因为counter += 1;而增加,而你的files.Length是恒定的。那么由于上面的计算,nProgress肯定会变得越来越少。因此,您可以 100% 降至 0%。

您是否应该反过来做,即:使用计数器作为渐进指标?

int nProgress = counter * 100 / files.Length; //use counter here...

此外,你可能希望在调用后台辅助角色进度之前增加计数器:

foreach (FileInfo file in files)
{
    loadedMessage = OpenPop.Mime.Message.Load(file);
    allLoadedMessages.Add(loadedMessage);
    counter += 1; //put before the progress;
    int nProgress = counter * 100 / files.Length;
    backgroundWorker2.ReportProgress(nProgress);
}