C# 为什么我的后台工作人员不为进度条工作
为什么我的后台工作程序不适用于进度条(默认情况下,将可见性设置为false.) 我试图在背景中有一个进度条。当用户单击OK按钮时,我启动计时器并使进度条可见。 并运行backgroundWorker.RunWorkerAsync();在backgroundWorker_Runworker Completed中,我将进度条的可见性设置为false 问题是它只显示进度条,而不显示进度 我的代码在这里:C# 为什么我的后台工作人员不为进度条工作,c#,.net,winforms,progress-bar,backgroundworker,C#,.net,Winforms,Progress Bar,Backgroundworker,为什么我的后台工作程序不适用于进度条(默认情况下,将可见性设置为false.) 我试图在背景中有一个进度条。当用户单击OK按钮时,我启动计时器并使进度条可见。 并运行backgroundWorker.RunWorkerAsync();在backgroundWorker_Runworker Completed中,我将进度条的可见性设置为false 问题是它只显示进度条,而不显示进度 我的代码在这里: private void btnOk_Click(object sender, E
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;
}
为什么它不在进度条中显示进度?有什么问题吗?你的
后台工作人员没有做任何事情。在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\u 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\u RunWorkerCompleted
,再次停止计时器
从不调用backgroundWorker\u ProgressChanged
,因为只有在调用时才会引发该事件(并且将backgroundWorker.ReportsProgress
设置为true
)
我认为您在doSomeWork()
中所做的工作应该在报告进度时在backgroundWorker\u 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;
}
这应该是你想要的。在这种情况下不需要计时器。您在这里混合了两个概念。请决定是使用计时器还是后台工作程序
什么也没发生的原因是你的后台工作人员什么都不做。因此后台工作程序立即完成,并调用backgroundWorker\u RunWorkerCompleted
,再次停止计时器
从不调用backgroundWorker\u ProgressChanged
,因为只有在调用时才会引发该事件(并且将backgroundWorker.ReportsProgress
设置为true
)
我认为您在doSomeWork()
中所做的工作应该在报告进度时在backgroundWorker\u 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;
}
这应该是你想要的。在这种情况下不需要计时器。问题是它只显示进度,但不显示进度。
你的意思是什么?请查看编辑。问题是它只显示进度,但不显示进度。
你的意思是什么?请查看编辑。进度条值在哪里更改?@testtest查看我的更新。您可以在doSomeWork
函数中设置报告进度值。您是对的,我已经尝试过在progrss栏中显示进度,但使用这种方式实现的问题是,我的表单假设是隐藏自己(this.hide()),然后在doSomething()函数中弹出另一个表单,但即使我这样做,进度栏也会100%显示进度“backgroundWorker.ReportProgress(100,空);“在form2.showdialog()之后;但那是永远不会发生的popups@testtest这是一个不同的问题。请发布一个新的问题。进度条值在哪里更改?@testtest请查看我的更新。您可以在doSomeWork
函数中设置报告进度值。您是对的,我已经尝试过在进度条中显示进度,但问题是使用这种方式实现的方法是,假设我的表单是隐藏自己(this.hide())并在doSomething()函数中弹出另一个表单,但即使是“backgroundWorker.ReportProgress(100,null)”,进度条也会100%地显示出来;“在form2.showdialog()之后;但那是永远不会发生的popups@testtest这是一个不同的问题。请为此发布一个新的问题。谢谢rene…如果你必须实现同样的目标,你会怎么做?请通过评论进行解释。非常感谢。你是对的,我已经尝试过在progrss栏中显示进度,但使用这种方式实现的问题是,M假设y表单隐藏自身(this.hide())并在doSomething()函数中弹出另一个表单,但进度条显示100%,即使是“backgroundWorker.ReportProgress”(100,null);“在form2.showdialog()之后;但该表单2从未弹出。@testtest这似乎是一个不同的问题,因此可能会为此发布一个新问题。谢谢rene…如果必须实现同样的目标,您将如何实现它?请通过评论进行解释。非常感谢。您是对的,我已经尝试过它,它在progrss栏中显示了进度,但使用这种方式会出现问题实现的方法是,假设我的表单隐藏自身(this.hide())并在doSomething()函数中弹出另一个表单,但即使我执行“backgroundWorker.ReportProgress(100,null)”,进度条也会100%显示;“在form2.showdialog()之后;但该form2从未弹出。@testtest这似乎是一个不同的问题,因此可能会为此发布一个新问题。