[英]Progress Bar not working properly in background worker
我需要有一个进度条来工作(可见)在一个进程之后,可见性应该设置为 false。 我正在为此过程使用后台工作人员。 但是在使用可见性属性时,应用程序会停止运行,否则应用程序运行正常。 我正在使用 Devexpress 进度条。请帮我解决这个问题。 这是我正在工作的代码。
private void Generate_Click(object sender, EventArgs e)
{
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.RunWorkerAsync();
}
private void BackgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
int a = 0;
int b = 0;
ProgressBar.Visible = true;
ProgressBar.Properties.Step = 1;
ProgressBar.Properties.PercentView = true;
ProgressBar.Properties.Maximum = SpecInformations.TotalSPCOCount;
ProgressBar.Properties.Minimum = 0;
Method_Call(a,b, sender as BackgroundWorker);
}
private void BackgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
ProgressBar.PerformStep();
ProgressBar.Update();
}
private void BackgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
ProgressBar.Visible = false;
}
代码可以帮助您在 BackgroundWorker 中使用进度条:
private void cmdButton_Click(object sender, EventArgs e)
{
BackgroundWorker worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
worker.RunWorkerAsync();
}
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
for (int i = 0; i < 101; i++)
{
worker.ReportProgress(i);
System.Threading.Thread.Sleep(1000);
}
}
private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
lblProgress.Text = ("Progress: " + e.ProgressPercentage.ToString() + "%");
}
有关其他信息可以使用链接
您无法从 DoWork 方法或其调用的任何方法内部访问 Windows 控件(如 ProgressBar),因为运行此代码的线程是后台线程,而不是创建控件的线程。 如果您尝试,您将收到一个异常,其消息指出该控件正被创建它的线程以外的线程访问。 这是windows控件不可侵犯的规则; 它们必须始终只能由创建它们的线程访问
BackgroundWorker 有一个必须设置为 true 的WorkerReportsProgress
属性,以及一个ReportProgress()
方法,您可以使用完成百分比的 int(并传递可选对象以获取更多信息)调用该方法。 当您在 DoWork 中调用此方法时,BackgroundWorker 将自动引发 ProgressChanged 事件,关键是,它使用创建它的前台线程(与创建其他控件的线程相同),因此 ProgressChanged 事件处理程序中的代码是使用正确的线程运行并且可以访问 ProgressBar 控件而不会导致异常
总之:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.