2010-03-22 2 views
7

Ich habe eine Aufgabe, deren Ausführung sehr lange dauert. Um den Benutzer über den Fortschritt zu informieren, habe ich eine Fortschrittsbalken, die ich innerhalb DoWork aktualisieren.WPF Der beste Punkt, um einen Fortschrittsbalken von BackgroundWorker zu aktualisieren

Kann mir jemand sagen, ob dies der beste Weg ist, um die Fortschrittsbalken zu aktualisieren? Ich habe gehört, dass es einen ReportProgress Event-Handler gibt, aber ich bin verwirrt, weil ich mich des Zwecks von ReportProgress unsicher bin.

Antwort

0

ReportProgress ist, was Sie verwenden würden, um den Fortschritt Ihrer Aufgabe zu aktualisieren, einschließlich Dinge wie die Benutzeroberfläche - in Ihrem Fall eine Progress-Leiste.

Sie sollten die MSDN-Dokumentation überprüfen, die sich here befindet.

im Grunde, Sie einen Handler für das Ereignis Report erstellen, dann in Ihrem DoWorkEventHandler Sie den Report wie so nennen:

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

Ok! Danke, also kann ich ReportProgress anrufen und es wird das ProgressChanged-Ereignis auslösen, wie Maurizio sagt. Dann Inside progressChanged-Ereignis Ich kann jedes Steuerelement meiner UI aktualisieren, das ich möchte, zum Beispiel progressbar, label, textblock, ... ohne Dispatcher.Invoke aufrufen zu müssen. Habe ich recht? Danke. – toni

+0

das ist richtig! –

0

Das Progress Ereignis ist, was Sie suchen. Stellen Sie jedoch sicher, dass Sie den BackgroundWorker wie unten beschrieben erstellen, sodass dieses Ereignis tatsächlich ausgelöst wird, wenn ReportProgress aufgerufen wird.

10

Da der Background-Mitarbeiter in einem separaten Thread arbeitet, treten Probleme auf, wenn Sie versuchen, auf UI-Objekte zuzugreifen. Der Aufruf der ReportProgress-Methode für den Worker innerhalb des DoWork-Handlers löst das ProgressChanged-Ereignis aus. Dieses Ereignis sollte im UI-Thread behandelt werden, um einfach auf das Steuerelement zugreifen zu können.

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