c# - 在进度条达到 100% 之前触发 RunWorkerCompleted

标签 c# winforms progress-bar backgroundworker

<分区>

我正在开发我的第一个 WinForms 应用程序,该应用程序具有后台工作程序和进度条。当我运行我的代码时,进度条看起来像是延迟了,因为它的动画——接近 100%——在执行 RunWorkerCompleted 的代码时还没有完成。 (进度条填满几百毫秒。) 有没有办法让事情更加同步?

从用户的角度来看,我希望进度条在其他事情开始发生之前达到 100%。

下方的 componentList.Count 通常为 5-15,这意味着进度动画每次增加大约跳跃 10-20%。

我的代码:

    private void ExecuteButton_Click(object sender, EventArgs e)
    {
        ExecuteButton.Enabled = false;
        backgroundWorker1.RunWorkerAsync();
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        int filesRun = 0;
        foreach(string file in componentList)
        {
            api.ExecuteInstructions(file);
            int progress = ++filesRun * 100 / componentList.Count;
            backgroundWorker1.ReportProgress(progress);
        }
    }

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar1.Value = e.ProgressPercentage;
    }

    void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        ExecuteButton.Enabled = true;
    }

我目前的解决方法,给人同时性的印象:

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        int filesRun = 0;
        foreach(string file in componentList)
        {
            api.ExecuteInstructions(file);
            int progress = ++filesRun * 100 / componentList.Count;
            if(progress == 100)
                progress--;

            backgroundWorker1.ReportProgress(progress);
        }

        Thread.Sleep(650); // cosmetic paus
        backgroundWorker1.ReportProgress(100);
    }

更新:

使用问题“更改值时禁用 .NET 进度条动画?”中建议的技巧。我设法通过使用现有实现然后添加以下逻辑来解决我的问题:

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar1.Value = e.ProgressPercentage;

        if (e.ProgressPercentage == 100)
        {
            progressBar1.Value = 101;
            progressBar1.Maximum = 100;
            progressBar1.Value = 100;
        }
    }

最佳答案

做一个简单的技巧,而不是解决 UI 线程同步问题。 只需在 _RunWorkerCompleted 中将进度条设置为 100%。

void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
  progressBar1.Value = 100;
  Application.DoEvents();
  ExecuteButton.Enabled = false;
}

关于c# - 在进度条达到 100% 之前触发 RunWorkerCompleted,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34570486/

相关文章:

c# - 在网格布局中创建动态按钮 - 创建幻方 UI

java Jframe从外部调用时拒绝渲染

c# - 指定的子项已经有父项。您必须首先对子级的父级调用removeView()。 (C#)

c# - 30-40 分钟后性能下降 c#

javascript - 在包含 html 代码 jquery 的变量中更改 Id & Class

c# - 使用 DialogResult.Cancel 的优势

c# - WinForm 启动画面和焦点

jquery - 在网站中下载的图像的图像进度条在 FF 中无法使用适当的结果

使用 NSTimer 快速查看进度

c# - 从 .NET/C# 中的站点下载图像