Verfasst von: bletra | 24. September 2012

Multithreading in WPF (TPL, MVVM): Tasks (Teil 2 von 5)

Tasks sind für mich gut zu verwendende Threads. Ich will diese tolle Klasse nur in Hinblick auf WPF und Hintergrundprozesse anschauen. Hierzu einige Strukturen, wie ich sie häufig verwende:

Aktion/Statements, die in den Hauptthread nicht belasten sollen, also im Hintergrund ausgeführt werden:

Task.Factory.StartNew(() => { … Aktionen …});

Dies geht auch mit Rückgabewerten:

Task<double> pi = Task<double>.Factory.StartNew(
() => { Thread.Sleep(10000); return 3.14; }
);
//…
//An anderer Stelle:
if (pi.IsCompleted)
   Debug.WriteLine(pi.Result);

In Bezug auf WPF und MVVM habe ich folgende Situation: Ich bin im UI-Thread, beispielsweise in einem Command eines ViewModels, setze einige Properties des ViewModels (Vorarbeit), führe anschließend einen längeren Prozess im Hintergrund aus, der Updates an Daten (ViewModel) des UI-Threads vornehmen soll und abschließend, nach Beenden des Hintergrundprozesseses, eine Meldung im UI-Thread ausgibt. Hierzu nehme ich folgendes Programmgerüst:

//Vorarbeit
//ich bin im UI-Thread und merke mir dessen Context/Scheduler
var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
//Hintergrundprozess starten
Task.Factory.StartNew(() =>
{
   //irgendwelchen zeitaufwändigen Aktionen
   //nun muss etwas im UI-Thread ablaufen
   Task.Factory.StartNew(() => { ... Zugriff auf ViewModel-Properties ... }, CancellationToken.None, TaskCreationOptions.None, uiScheduler);
   //zurück im Hintergrundthread
}, CancellationToken.None).ContinueWith( //nach Beenden des Hintergrundthreads führe dies im UI-Thread aus:
      (task) => { ... }, uiScheduler);
//wieder im UI-Thread

Im nächsten Artikel geht es darum, einen solchen Hintegrundprozess abbrechen zu können (cancel).

Advertisements

Responses

  1. […] Teil 2: Tasks […]

  2. […] Teil 2: Tasks […]

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

  4. […] Teil 2: Tasks […]


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: