C# – Hintergrundaufgaben in Task auslagern und abbrechen

Veröffentlicht von

Nach dem Beispiel mit dem BackgroundWorker, wollen wir nun das gleiche Beispiel mit Tasks anschauen.

BackgroundWorker und Tasks verfolgen das gleiche Ziel, lange Aufgaben können im Hintergrund abgearbeitet werden. Welchen man verwendet ist meiner Meinung nach Geschmackssache und hängt auch ein wenig von der Aufgabe ab.

Unsere Beispielanwendung zählt einfach bis 10 und zeigt einen Progress an. Außerdem soll der Task abbrechbar sein. Das Beispielprojekt gibt es am Ende zum Download.

Unser Code:

_cts = new CancellationTokenSource();
var token = _cts.Token;


var result = await Task.Factory.StartNew(() =>
{
    for (int i = 0; i <= 10; i++)
    {
        Output = i.ToString();
        CurrentProgress = i;

        token.ThrowIfCancellationRequested();
        Thread.Sleep(1000);
    }
}, token).ContinueWith(task =>
{
    switch (task.Status)
    {
        case TaskStatus.Canceled:
            return "Cancelled";
        case TaskStatus.Faulted:
            return "Faulted";
        default:
            return "Finished";

    }
});

Wir sehen, dass wir einen Task starten, welcher einen Zähler mit Wartezeit hochzählt. Den Progress geben wir ein die GUI weiter, hierzu verwenden wir ein Binding mit einem Property. Dies erlaubt es uns auch die GUI direkt aus dem Task heraus zu aktualisieren.

Über das Token der CancellationTokenSource können wir den Task zudem von außen abbrechen. Diese ist als Membervariable deklariert:

private CancellationTokenSource _cts;

Über die Cancel-Methode können wir den Task abbrechen.

_cts?.Cancel();

Der Abbruch wird im “switch” Statement behandelt. Standardmäßig tritt hier eine “System.OperationCanceldException” auf und der Debugger hält hier kurz inne. Eine Einstellung kann verhindern, dass wir jedes Mal hier anhalten.

Im “switch” Statement können wir zudem auch auf andere Zustände reagieren, z.B. einen normalen Durchlauf.

Download des Beispiels

Kommentar hinterlassen

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