我需要一个进度条才能在一个进程中工作(可见),之后应将可见性设置为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;
}
您不能从DoWork方法内部或它调用的任何方法中访问Windows控件,例如ProgressBar,因为运行此代码的线程是后台线程,而不是创建控件的线程。如果尝试,您将得到一个异常,该异常的消息表明该控件正在由创建它的线程以外的线程访问。这是有关Windows控件的不可侵犯的规则。必须始终仅由创建它们的线程访问它们]
BackgroundWorker具有必须设置为true的WorkerReportsProgress
属性,以及可以用完成百分比的int调用(并传递可选对象以获取更多信息)的ReportProgress()
方法。当您在DoWork中调用此方法时,BackgroundWorker会自动引发ProgressChanged事件,并且严重地,它使用创建时使用的前台线程(与创建其他控件的线程相同)执行此操作,因此ProgressChanged事件处理程序中的代码为使用适当的线程运行,并且可以访问ProgressBar控件而不会引起异常
摘要:
该代码可以帮助您使用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() + "%");
}
有关其他信息,请使用link