C#, WPF und der BackgroundWorker

Veröffentlicht von

Mit dem BackgroundWorker lassen sich zeitintensive Dinge leicht im Hintergrund der Anwendung ausführen. Man kann sich über den Fortschritt informieren lassen, den Worker abbrechen.

Das gesamte Beispiel gibt es wie gehabt am Ende zum Download als Visual Studio Projekt. Einen Background-Worker können wir leicht anlegen:

private BackgroundWorker _worker = new BackgroundWorker();

Anschließend können wir diesen konfigurieren und die Events zuweisen:

_worker.DoWork += Worker_DoWork;
_worker.RunWorkerCompleted += Worker_RunWorkerCompleted;
_worker.ProgressChanged += WorkerOnProgressChanged;
_worker.WorkerReportsProgress = true;
_worker.WorkerSupportsCancellation = true;

Wir legen fest, ob der Background-Worker abbrechbar ist oder Fortschritt mitteilt. Mit den verschiedenen Events, können wir festlegen was passiert, wie der Fortschritt behandelt wird oder was nach Arbeitsende passiert.

Den Worker arbeiten lassen

In unserem Do_Work-Event programmieren wir, was im Hintergrund zu tun ist.

private void Worker_DoWork(object sender, DoWorkEventArgs e)
{
    for (int i = 0; i <= 100; i++)
    {
        _worker.ReportProgress(i);

        if (_worker.CancellationPending)
        {
            e.Cancel = true;
            return;
        }

        Output = i.ToString();
        Thread.Sleep(1000);
    }
}

In unserem Beispiel nicht viel, wir zählen bis 100 hoch, mit etwas Wartezeit. Außerdem geben wir den Fortschritt weiter. Den Background-Worker können mit

_worker.RunWorkerAsync();

Starten. In der Methode sehen wir auch, wie wir auf einen Abbruch reagieren können. Der Abbruch obliegt uns. Eine Anfrage zum Abbrechen, können mit dem Aufruf _worker.CancelAsync(); anfragen.

Fehlen nur noch der Fortschritt und Ende der Arbeit:

 private void WorkerOnProgressChanged(object sender, ProgressChangedEventArgs e)
{
    ProgressBar.Value = e.ProgressPercentage;
}

private void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    ButtonCalc.IsEnabled = true;
    ButtonCancel.IsEnabled = false;
    ProgressBar.Value = 0;
}

Mehr ist es auch nicht. Mit dem BackgroundWorker kann also schnell eine Aufgabe in den Hintergrund verschoben werden.

Download des Beispiels

Ein Kommentar

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert