我的任务需要很长时间才能执行。为了告知用户进度,我在DoWork
内更新了进度条。
有人可以告诉我这是否是更新进度条的最佳方式?我听说有一个ReportProgress
事件处理程序,但我很困惑,因为我不确定ReportProgress
的目的。
答案 0 :(得分:10)
由于后台工作程序在单独的线程中工作,因此如果您尝试访问UI对象,则会遇到问题。从DoWork处理程序内部调用worker上的ReportProgress方法会引发ProgressChanged事件。该事件应在UI线程中处理,以便轻松访问控件。
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += DoWorkHandler;
worker.WorkerReportsProgress = true;
worker.ProgressChanged += (s, e) =>
{ myProgressBar.Value = e.ProgressPercentage; };
worker.RunWorkerAsync();
...
public void DoWorkHandler(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
while (working)
{
// Do Stuff
worker.ReportProgress(progressPercentage);
}
}
答案 1 :(得分:0)
ReportProgress是您用来更新任务进度的方法,包括UI - 在您的情况下,一个proggress栏。
您应该查看位于here的MSDN文档。
基本上,你为ReportProgress事件创建一个处理程序,然后在你的DoWorkEventHandler中调用ReportProgress,如下所示:
worker.ReportProgress((i * 10));
答案 2 :(得分:0)
您正在寻找ProgressChanged事件。但是,请确保像下面一样创建BackgroundWorker,以便在调用ReportProgress时实际引发此事件。
BackgroundWorker bw = new BackgroundWorker() { WorkerReportsProgress = true };
bw.ProgressChanged += ... ;