在WPF中,如何从后台线程更新进度条?

3

我正在尝试使用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。为什么?

2个回答

1

您忘记运行工作程序:

     worker.RunWorkerAsync();

1
如果您尝试更改UI内容,应该将调用放在UI Dispatcher上。您不能从后台线程修改UI对象。请使用以下代码替换您的行 -
App.Current.Dispatcher.Invoke((Action)delegate()
        {
            Title += j.ToString();
        });

并且

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接