2010-03-22 7 views
7

Tôi có một nhiệm vụ mất nhiều thời gian để thực thi. Để thông báo cho người dùng về tiến trình, tôi có thanh tiến trình mà tôi cập nhật bên trong DoWork.WPF Điểm tốt nhất để cập nhật thanh tiến trình từ BackgroundWorker

Ai có thể cho tôi biết nếu đây là cách tốt nhất để cập nhật thanh tiến trình ? Tôi đã nghe nói rằng có một xử lý sự kiện ReportProgress nhưng tôi bối rối vì tôi không chắc chắn về mục đích của ReportProgress.

Trả lời

0

ReportProgress là những gì bạn sẽ sử dụng để cập nhật tiến trình công việc của bạn, bao gồm những thứ như giao diện người dùng - trong trường hợp của bạn, một thanh proggress.

Bạn nên xem tài liệu MSDN, nằm here.

về cơ bản, bạn tạo một handler cho sự kiện ReportProgress, sau đó trong DoWorkEventHandler của bạn, bạn gọi ReportProgress như vậy:

worker.ReportProgress((i * 10)); 
+0

Ok! cảm ơn, vì vậy tôi có thể gọi ReportProgress và nó sẽ nâng cao sự kiện ProgressChanged như Maurizio nói. Sau đó, Inside progress Sự kiện đã thay đổi Tôi có thể cập nhật bất kỳ điều khiển giao diện người dùng nào của mình mà tôi muốn, ví dụ, thanh tiến trình, nhãn, textblock, ... mà không cần phải gọi Dispatcher.Invoke. Tôi có đúng không? Cảm ơn. – toni

+0

đúng! –

0

Sự kiện ProgressChanged là những gì bạn đang tìm kiếm. Tuy nhiên, hãy chắc chắn rằng bạn tạo BackgroundWorker như dưới đây để nó thực sự làm tăng sự kiện này khi ReportProgress được gọi.

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

Vì công nhân nền hoạt động trong một chuỗi riêng biệt, bạn sẽ gặp sự cố nếu bạn cố truy cập các đối tượng giao diện người dùng. Việc gọi phương thức ReportProgress trên công nhân từ bên trong trình xử lý DoWork làm tăng sự kiện ProgressChanged. Sự kiện đó phải được xử lý trong chuỗi giao diện người dùng để dễ dàng truy cập vào điều khiển.

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