【问题标题】:WPF Best point to update a progress bar from BackgroundWorkerWPF 从 BackgroundWorker 更新进度条的最佳点
【发布时间】:2010-03-22 21:21:26
【问题描述】:

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

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

【问题讨论】:

    标签: wpf progress-bar backgroundworker


    【解决方案1】:

    由于后台工作程序在单独的线程中工作,因此如果您尝试访问 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);
            }
        }
    

    【讨论】:

      【解决方案2】:

      ProgressChanged 事件就是您要寻找的。但是,请确保创建如下所示的 BackgroundWorker,以便在调用 ReportProgress 时实际引发此事件。

      BackgroundWorker bw = new BackgroundWorker() { WorkerReportsProgress = true };
      bw.ProgressChanged += ... ;
      

      【讨论】:

        【解决方案3】:

        ReportProgress 是您用来更新任务进度的工具,包括 UI 之类的东西——在您的情况下是进度条。

        您应该查看位于 here 的 MSDN 文档。

        基本上,您为 ReportProgress 事件创建一个处理程序,然后在您的 DoWorkEventHandler 中,您像这样调用 ReportProgress:

        worker.ReportProgress((i * 10));
        

        【讨论】:

        • 好的!谢谢,所以我可以调用 ReportProgress,它会像 Maurizio 所说的那样引发 ProgressChanged 事件。然后在 progressChanged 事件中,我可以更新我想要的 UI 的任何控件,例如进度条、标签、文本块……,而无需调用 Dispatcher.Invoke。我对吗?谢谢。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多