2012-11-11 51 views
3

我正在尝试使用BackgroundWorker来改进progressbar。最后的目标是显示背景搜索的进度,但我首先想通过简单的模拟来了解进度条。这是代码:更新WPF中的后台工作进度条

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。为什么?

回答

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"; 
     }); 
1

你忘了运行工人:

 worker.RunWorkerAsync();