WPF Best指向从BackgroundWorker更新进度条

时间:2010-03-22 21:21:26

标签: wpf progress-bar backgroundworker

我的任务需要很长时间才能执行。为了告知用户进度,我在DoWork内更新了进度条

有人可以告诉我这是否是更新进度条的最佳方式?我听说有一个ReportProgress事件处理程序,但我很困惑,因为我不确定ReportProgress的目的。

3 个答案:

答案 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 += ... ;