【发布时间】:2010-03-22 21:21:26
【问题描述】:
我有一个需要很长时间才能执行的任务。为了通知用户进度,我在DoWork 内更新了一个进度条。
谁能告诉我这是否是更新进度条的最佳方式?我听说有一个ReportProgress 事件处理程序,但我很困惑,因为我不确定ReportProgress 的用途。
【问题讨论】:
标签: wpf progress-bar backgroundworker
我有一个需要很长时间才能执行的任务。为了通知用户进度,我在DoWork 内更新了一个进度条。
谁能告诉我这是否是更新进度条的最佳方式?我听说有一个ReportProgress 事件处理程序,但我很困惑,因为我不确定ReportProgress 的用途。
【问题讨论】:
标签: wpf progress-bar backgroundworker
由于后台工作程序在单独的线程中工作,因此如果您尝试访问 UI 对象,将会遇到问题。从 DoWork 处理程序内部调用工作人员的 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);
}
}
【讨论】:
ProgressChanged 事件就是您要寻找的。但是,请确保创建如下所示的 BackgroundWorker,以便在调用 ReportProgress 时实际引发此事件。
BackgroundWorker bw = new BackgroundWorker() { WorkerReportsProgress = true };
bw.ProgressChanged += ... ;
【讨论】:
ReportProgress 是您用来更新任务进度的工具,包括 UI 之类的东西——在您的情况下是进度条。
您应该查看位于 here 的 MSDN 文档。
基本上,您为 ReportProgress 事件创建一个处理程序,然后在您的 DoWorkEventHandler 中,您像这样调用 ReportProgress:
worker.ReportProgress((i * 10));
【讨论】: