进度条在后台工作人员中无法正常工作
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() + "%");
}
更多信息可以使用 link
您无法从 DoWork 方法或它调用的任何方法内部访问 Windows ProgressBar 等控件,因为 运行 此代码的线程是后台线程,而不是创建的线程控制。如果您尝试,您将得到一个异常,其消息表明该控件正被创建它的线程以外的线程访问。这是关于windows控件的不可侵犯的规则;它们必须始终只能由创建它们的线程访问
BackgroundWorker 有一个必须设置为 true 的 WorkerReportsProgress
属性 和一个可以用 int 调用的 ReportProgress()
方法(并传递一个可选对象以获取更多信息) 的完成百分比。当您在 DoWork 中调用此方法时,BackgroundWorker 将自动引发 ProgressChanged 事件,并且关键的是,它使用创建它的前台线程(创建其他控件的线程相同)执行此操作,因此您的 ProgressChanged 事件处理程序中的代码是运行 使用正确的线程并且可以在不引起异常的情况下访问 ProgressBar 控件
总结:
- 将 WorkerReportsProgress 设置为 true
- 在 DoWork 中调用 ReportProgress,传递完成百分比或使用 int 指示进程已达到某个阶段(不一定是百分比)
- 将事件处理程序附加到工作人员的 ProgressChanged 事件
- 将您的 ProgressBar 代码移至 ProgressChanged 事件处理程序
我需要有一个进度条来工作(可见),在一个进程之后,可见性应该设置为 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() + "%");
}
更多信息可以使用 link
您无法从 DoWork 方法或它调用的任何方法内部访问 Windows ProgressBar 等控件,因为 运行 此代码的线程是后台线程,而不是创建的线程控制。如果您尝试,您将得到一个异常,其消息表明该控件正被创建它的线程以外的线程访问。这是关于windows控件的不可侵犯的规则;它们必须始终只能由创建它们的线程访问
BackgroundWorker 有一个必须设置为 true 的 WorkerReportsProgress
属性 和一个可以用 int 调用的 ReportProgress()
方法(并传递一个可选对象以获取更多信息) 的完成百分比。当您在 DoWork 中调用此方法时,BackgroundWorker 将自动引发 ProgressChanged 事件,并且关键的是,它使用创建它的前台线程(创建其他控件的线程相同)执行此操作,因此您的 ProgressChanged 事件处理程序中的代码是运行 使用正确的线程并且可以在不引起异常的情况下访问 ProgressBar 控件
总结:
- 将 WorkerReportsProgress 设置为 true
- 在 DoWork 中调用 ReportProgress,传递完成百分比或使用 int 指示进程已达到某个阶段(不一定是百分比)
- 将事件处理程序附加到工作人员的 ProgressChanged 事件
- 将您的 ProgressBar 代码移至 ProgressChanged 事件处理程序