为什么我的 backgroundworker 不为进度条工作
Why my backgroundworker do not work for progress bar
为什么我的后台工作者不能为进度条工作(默认情况下将可见性设置为 false。)。
我正在尝试在后台设置进度条。当用户单击“确定”按钮时,我会启动计时器并使进度条可见。
和 运行 backgroundWorker.RunWorkerAsync();在 backgroundWorker_RunWorkerCompleted 中,我将进度条的可见性设置为 false。
问题是只显示进度条,不显示进度。
我的代码在这里:
private void btnOk_Click(object sender, EventArgs e)
{
timer.Start();
progressBar.Visible = true;
backgroundWorker.RunWorkerAsync();
doSomeWork();
}
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
}
private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
timer.Stop();
progressBar.Visible = false;
}
private void timer_Tick(object sender, EventArgs e)
{
MessageBox.Show("called");
if (progressBar.Value == progressBar.Maximum)
{
progressBar.Value = progressBar.Minimum;
return;
}
progressBar.PerformStep();
}
private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar.Value = e.ProgressPercentage;
}
为什么进度条不显示进度?有什么问题吗?
您的 backgroundWorker_DoWork
没有做任何事情。在 DoWork
事件中移动 doSomeWork
。并且您需要将 ReportProgress
设置为 true
。
private void btnOk_Click(object sender, EventArgs e)
{
timer.Start();
progressBar.Visible = true;
backgroundWorker.ReportsProgress = true;
backgroundWorker.RunWorkerAsync();
}
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
doSomeWork();
}
private void doSomeWork()
{
//do what you want here..
backgroundWorker.ReportProgress(yourprogresspercentagenumber);
//do what you want again..
backgroundWorker.ReportProgress(yourprogresspercentagenumber);
}
您在这里混淆了两个概念。请决定是否要使用计时器 或 后台工作程序。
什么都没发生的原因是你的backgroundWorker_DoWork
什么都没做。所以后台工作人员立即完成并调用 backgroundWorker_RunWorkerCompleted
,再次停止你的计时器。
backgroundWorker_ProgressChanged
永远不会被调用,因为只有当您调用 backgroundWorker.ReportProgress()
(并将 backgroundWorker.ReportsProgress
设置为 true
)时才会引发该事件。
我认为您在 doSomeWork()
中所做的工作应该在 backgroundWorker_DoWork
中完成,同时报告进度。尝试这样的事情:
private void btnOk_Click(object sender, EventArgs e)
{
progressBar.Visible = true;
backgroundWorker.ReportsProgress = true;
backgroundWorker.RunWorkerAsync();
}
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
doALittleWork();
backgroundWorker.ReportProgress(10, null);
doMoreWork();
backgroundWorker.ReportProgress(20, null);
//...
doLastWork();
backgroundWorker.ReportProgress(100, null);
}
private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
progressBar.Visible = false;
}
private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar.Value = e.ProgressPercentage;
}
这应该可以满足您的要求。在那种情况下不需要定时器。
为什么我的后台工作者不能为进度条工作(默认情况下将可见性设置为 false。)。
我正在尝试在后台设置进度条。当用户单击“确定”按钮时,我会启动计时器并使进度条可见。 和 运行 backgroundWorker.RunWorkerAsync();在 backgroundWorker_RunWorkerCompleted 中,我将进度条的可见性设置为 false。
问题是只显示进度条,不显示进度。
我的代码在这里:
private void btnOk_Click(object sender, EventArgs e)
{
timer.Start();
progressBar.Visible = true;
backgroundWorker.RunWorkerAsync();
doSomeWork();
}
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
}
private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
timer.Stop();
progressBar.Visible = false;
}
private void timer_Tick(object sender, EventArgs e)
{
MessageBox.Show("called");
if (progressBar.Value == progressBar.Maximum)
{
progressBar.Value = progressBar.Minimum;
return;
}
progressBar.PerformStep();
}
private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar.Value = e.ProgressPercentage;
}
为什么进度条不显示进度?有什么问题吗?
您的 backgroundWorker_DoWork
没有做任何事情。在 DoWork
事件中移动 doSomeWork
。并且您需要将 ReportProgress
设置为 true
。
private void btnOk_Click(object sender, EventArgs e)
{
timer.Start();
progressBar.Visible = true;
backgroundWorker.ReportsProgress = true;
backgroundWorker.RunWorkerAsync();
}
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
doSomeWork();
}
private void doSomeWork()
{
//do what you want here..
backgroundWorker.ReportProgress(yourprogresspercentagenumber);
//do what you want again..
backgroundWorker.ReportProgress(yourprogresspercentagenumber);
}
您在这里混淆了两个概念。请决定是否要使用计时器 或 后台工作程序。
什么都没发生的原因是你的backgroundWorker_DoWork
什么都没做。所以后台工作人员立即完成并调用 backgroundWorker_RunWorkerCompleted
,再次停止你的计时器。
backgroundWorker_ProgressChanged
永远不会被调用,因为只有当您调用 backgroundWorker.ReportProgress()
(并将 backgroundWorker.ReportsProgress
设置为 true
)时才会引发该事件。
我认为您在 doSomeWork()
中所做的工作应该在 backgroundWorker_DoWork
中完成,同时报告进度。尝试这样的事情:
private void btnOk_Click(object sender, EventArgs e)
{
progressBar.Visible = true;
backgroundWorker.ReportsProgress = true;
backgroundWorker.RunWorkerAsync();
}
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
doALittleWork();
backgroundWorker.ReportProgress(10, null);
doMoreWork();
backgroundWorker.ReportProgress(20, null);
//...
doLastWork();
backgroundWorker.ReportProgress(100, null);
}
private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
progressBar.Visible = false;
}
private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar.Value = e.ProgressPercentage;
}
这应该可以满足您的要求。在那种情况下不需要定时器。