Verfasst von: bletra | 28. September 2012

Multithreading in WPF (TPL, MVVM): Cancel (Teil 3 von 5)

Im letzten Artikel dieser Reihe habe ich die Tasks eingeführt, die eine Ausführung von Hintergrundprozessen einfach ermöglichen. In diesem Artikel zeige ich den Mechanismus, wie solche Hintergrundprozesse wieder abgebrochen werden können.
Ein Task, der auf Cancel reagieren soll, benötigt bei der Erstellung ein sogenanntes CancellationToken. Dieses CancellationToken ist an eine Quelle gebunden, so dass verschiedene Tasks einzeln oder auch zusammengehörend abgebrochen werden können.
Außerdem muss der Hintergrundprozess so aufgebaut sein, dass er auf ein Cancel reagieren kann, z.B. in Form einer Schleife (Eine gute Diskussion, warum Threads nicht einfach „abgeschossen“ werden sollen, finden Sie unter Is it possible to abort a Task like aborting a Thread (Thread.Abort method)?).
Insgesamt ergibt sich in MVVM folgendes Muster:

  1. CancellationTokenSource als Member deklarieren:
    System.Threading.CancellationTokenSource cancelTokenSource;
  2. Token vor Starten des Tasks erstellen:
    System.Threading.CancellationToken cancelToken = cancelTokenSource.Token;
  3. Token dem Task mitgeben und in diesem auf Cancel abfragen:
Task.Factory.StartNew(() => {
   //...
   for (...) {
      if (cancelTokenSource.Token.IsCancellationRequested)
        //Reaktion: return oder break oder ...
   };
}, cancelTokenSource.Token);
  1. Cancel einfordern (in MVVM: Cancel-Button mit DelegateCommand an folgende Methode binden):
private void CancelWork() {
   if (cancelTokenSource != null)
      cancelTokenSource.Cancel();
}

Dies ist nur ein Grundgerüst, wie es für den betrachteten Kontext ausreicht. Eine ausführlichere Darstellungen finden Sie in den folgenden Artikeln:

Eine Basis von MVVM ist die Datenbindung. Welche Schwierigkeiten diese Bindung einer WPF-Oberfläche an eine Collection (Liste) bei asychronen Prozessen aufweist, diskutiere ich im nächsten Artikel dieser Reihe.

Advertisements

Responses

  1. […] Teil 3: Cancel […]

  2. […] Teil 3: Cancel […]

  3. […] Teil 3: Cancel […]

  4. […] Teil 3: Cancel […]


Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

Kategorien

%d Bloggern gefällt das: