www.rolandk.de
- Aktuelle Themen zu .Net -
Achtung: Hier handelt es sich um meine alte Seite.
Die aktuelle ist unter folgendem Link erreichbar: www.rolandk.de/wp/
Home Tutorials Threading Chapter 1 - BackgroundWorker in Wpf oder Windows.Forms




















































Chapter 1 - BackgroundWorker in Wpf oder Windows.Forms
Montag, den 15. November 2010 um 20:27 Uhr

 

 

Allgemeines

Threading wird für alle Entwickler ein zunehmend wichtiges Thema. Mein PC etwa hat aktuell einen 4 Kern Prozessor, 8 Kerner sind bereits in Entwicklung und in ein paar Jahren werden wir wohl 16 Kerner haben. Ob man diese enorme Leistung für die eigene Anwendung benötigt, ist dabei wieder eine ganz andere Frage. Ein Beispiel: Aktuelle PC-Spiele etwa lagern Aufgaben wie Physik-Berechnung, 3D-Rendering und Spielelogik in eigene Threads aus, da ein Prozessor alleine mit all diesen Aufgaben überlastet wäre. Für uns Normalsterblichen Anwendungsprogrammierer ist die Motivation, Threading zu verwenden, eventuell eine ganz andere: Wer kennt nicht die Situation, wenn man auf einen Lade-Button in einer Anwendung klickt und dann nichts mehr reagiert, bis der Ladevorgang abgeschlossen ist? In diesem ersten Artikel meines Threading-Tutorials will ich kurz erklären, wie man diesen einfachen Fall mithilfe des BackgroundWorker-Objekts sowohl in Windows.Forms, als auch in WPF Anwendungen einfach umschiffen kann.

 

Die BackgroundWorker Klasse

Die BackgroundWorker-Klasse befindet sich im System.ComponentModel Namespace ist damit nicht nur für Windows.Forms Anwendungen gedacht. Diese Klasse kann also in Windows.Forms und in Wpf auf dieselbe Weise verwendet werden. Nachfolgend ein Ausschnitt der wichtigsten Methoden dieser Klasse:

  1. public class BackgroundWorker : Component
  2. {
  3. public BackgroundWorker();
  4. public bool IsBusy { get; }
  5. public event DoWorkEventHandler DoWork;
  6. public event RunWorkerCompletedEventHandler RunWorkerCompleted;
  7. public void RunWorkerAsync(object argument);
  8. ...
  9. }

Die Methoden dieser Klasse sind für den Einsteiger leicht verständlich. Zunächst kann mittels des Standardkonstruktors ein BackgroundWorker Objekt angelegt werden. In Windows.Forms ist dieser Schritt sogar besonders einfach, da man den BackgroundWorker direkt als Komponente auf die Form oder das Steuerelement ziehen kann. In Wpf dagegen muss man diesen Schritt aber manuell machen. Als nächstes sollten die beiden Ereignisse DoWork und RunWorkerCompleted behandelt werden. Nachfolgender Codeausschnitt zeigt diese 3 Schritte kurz:

  1. //Initialize the BackgroundWorker object
  2. m_backgroundWorker = new BackgroundWorker();
  3. m_backgroundWorker.DoWork += new DoWorkEventHandler(OnBackgroundWorkerDoWork);
  4. m_backgroundWorker.RunWorkerCompleted += new
  5. RunWorkerCompletedEventHandler(OnBackgroundWorkerRunWorkerCompleted);
  6.  
  7. ...
  8.  
  9. ///
  10. /// Called when BackgroundWorker starts working (Called in Worker-Thread).
  11. ///
  12. private void OnBackgroundWorkerDoWork(object sender, DoWorkEventArgs e)
  13. {
  14. //Simulate some work
  15. Thread.Sleep(...);
  16. }
  17.  
  18. ///
  19. /// Called when BackgroundWorker has finished (Called in GUI-Thread).
  20. ///
  21. private void OnBackgroundWorkerRunWorkerCompleted(
  22. object sender,
  23. RunWorkerCompletedEventArgs e)
  24. {
  25. //Update the gui here
  26. ...
  27. }

Wichtig an der ganzen Sache ist folgendes: Die Aufgabe, die der Hintergrundthread erledigen soll, muss innerhalb des DoWork Ereignisses implementiert sein. Aktualisierung der Gui ist innerhalb dieses Ereignisses nicht erlaubt, da nur der Gui-Thread auf die Oberfläche zugreifen kann. Stattdessen soll die Aktualisierung der Gui innerhalb des RunWorkerCompleted Ereignisses stattfinden, da dieses Ereignisses wieder innerhalb des Gui-Threads aufgerufen wird. Gestartet wird der BackgroundWorker relativ einfach über einen Aufruf der Methode RunWorkerAsync, wie in nachfolgenden Ausschnitt zu sehen:

  1. m_backgroundWorker.RunWorkerAsync();

 

Zusammenfassung

In diesem kurzen Artikel habe ich erklärt, wie man zeitaufwändige Aufgaben ohne großen Programmieraufwand in einen Hintergrundthread verlagern kann. Zusätzlich zu der vorgestellten Funktion kann der BackgroundWorker auch den aktuellen Fortschritt an die Gui melden oder auch abgebrochen werden. Diesem Artikel ist ein Beispielprogramm angehängt, dass eine einfache Nutzung des BackgroundWorkers sowohl mit einem Wpf-Fenster, als auch mit einem Windows.Forms Fenster zeigt. In den nächsten Artikeln dieses Tutorials werden weitere Techniken der Multithread-Programmierung und schließlich auch die genaue Funktionsweise der BackgroundWorker-Klasse vorgestellt.

 

Quellen

  • Msdn Magazin
    Ein Artikel über den Wpf Dispatcher von Shawn Wildermuth.
  • Msdn
    Beschreibung der Klasse BackgroundWorker auf Msdn.

 

Siehe auch...

 

Kommentar hinzufügen

Ihr Name:
Kommentar: