Wenn man aus einem Thread heraus eine Zeitaufwändige Operation durchführt, kann dies dazu führen, dass man den Eindruck bekommt, das Fenster wäre eingefroren. Der Grund ist ganz einfach, weil diese Aufgabe im ersten Thread stattfindet und solange dauert, bis es fertig ist. Jetzt stellt .Net den Threading Namespace zur Verfügung womit man für solche Aufgaben einen neuen Thread aufmachen könnte. Eben genau dies tut auch der Backgroundworker nur in einer stark vereinfachter Form.
Backgroundworker einbinden:
1. Namespace hinzufügen:
1 |
using System.ComponentModel; |
2. Backgroundworker deklarieren:
1 |
private readonly BackgroundWorker worker = new BackgroundWorker(); |
3. diesem Objekt events zuweisen:
1 2 |
worker.DoWork += worker_DoWork; worker.RunWorkerCompleted += worker_RunWorkerCompleted; |
4. die beiden Methoden implementieren:
1 2 3 4 5 6 7 8 9 10 |
private void worker_DoWork(object sender, DoWorkEventArgs e) { // die Arbeit des workers läuft hier ab } private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { //sobald fertig, führe diese Arbeit aus } |
5. worker asynchron ausführen lassen:
1 |
worker.RunWorkerAsync(); |
wünscht man einen Bericht über den derzeitigen Prozess, so muss man auch das event ProgressChanged hinzufügen, ReportProgress(Int32) in DoWorks ausführen lassen und in WorkerReportsProgress das Resultat bekommen
Häufigste Problematik die man Anfangs hat ist, dass man nicht auf die Steuerelemente aus dem 1. Thread zugreifen kann. Abhilfe schafft dort
1 2 3 4 5 |
string text = null; myTextBox.Dispatcher.Invoke(new Action(delegate() { text = myTextBox.Text; })); |
Login