【问题标题】:Update progressbar from a backgroundworker in WPF从 WPF 中的后台工作人员更新进度条
【发布时间】:2012-11-11 15:58:21
【问题描述】:

我正在尝试使用BackgroundWorker 推进进度条。最终目标是显示后台搜索的进度,但我首先想通过做一个简单的模拟来了解进度条。这是代码:

    public MainWindow()
    {
        InitializeComponent();

        worker = new BackgroundWorker(); // variable declared in the class
        worker.WorkerReportsProgress = true;
        worker.DoWork += new DoWorkEventHandler(worker_DoWork);
        worker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
        worker.RunWorkerCompleted += worker_RunWorkerCompleted;
    }

    private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        this.Title += " DONE";
    }

    private void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        for(int j = 0; j <= 100; j++)
        {
            worker.ReportProgress(j);
            Title += j.ToString();
            Thread.Sleep(50);
        }
    }

    void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        searchProgressBar.Value = e.ProgressPercentage;
    }

但是当我运行它时,它会直接跳到最后,而不会以任何方式改变进度条。当我逐步调试它时,我到达的最后一步是worker.ReportProgress(j);,然后控制权返回到程序并调用worker_RunWorkerCompleted。为什么?

【问题讨论】:

    标签: c# multithreading backgroundworker


    【解决方案1】:

    如果您尝试更改UI content,您应该拨打UI Dispatcher。你can't modify UI objects from background thread。用这些替换你的行 -

    App.Current.Dispatcher.Invoke((Action)delegate()
            {
                Title += j.ToString();
            });
    

    App.Current.Dispatcher.Invoke((Action)delegate()
            {
                Title = "Done";
            });
    

    【讨论】:

      【解决方案2】:

      你忘了运行 worker:

           worker.RunWorkerAsync();
      

      【讨论】:

        猜你喜欢
        • 2013-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-11
        • 1970-01-01
        • 2014-08-14
        • 1970-01-01
        • 2019-08-09
        相关资源
        最近更新 更多