<分区>
我正在开发我的第一个 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;
}
}