TaskHelper-Klasse

Funktionen zum Starten von Hintergrundaufgaben und Synchronisation mit dem UI-Thread, sowie zum Warten auf den WPF-Dispatcher.

Um schnell einen Vorgang in einem Hintergrundthread zu starten, gibt es seit .NET 4.0 in der Task Parallel Library (TPL) die Task-Klasse. Dieses einfache Szenario ist aber nur der Einstieg. Sobald die Hintergrundaktivität anschließend mit dem UI-Thread synchronisiert werden soll, um dort das Ergebnis anzuzeigen, wird es aufwändig. Diesen oft vorkommenden Fall für GUI-Anwendungen, und noch ein paar weitere Synchronisationsvorgänge rund um den WPF-Dispatcher, stellt diese TaskHelper-Klasse bereit.

Manches davon ist auch mit den C#-5.0-Schlüsselwörtern async und await umsetzbar (.NET 4.5, VS 2012). Diese Klasse wurde allerdings bereits für .NET-4.0-Anwendungen geschrieben und reduziert hier den syntaktischen Aufwand auf ein Minimum.

Kompatibilität: .NET Ab Version 4.0

Beispiel

Das folgende Beispiel zeigt die verschiedenen Anwendungsmöglichkeiten von TaskHelper:

// Vorgang in einem Hintergrundthread ausführen, danach mit Code im UI-Thread fortsetzen:
// Aktivitätsdialog erstellen (noch nicht anzeigen)
var dlg = new ActivityDialog("Bitte warten Sie, während die Dateien gesucht werden.");
var list = new List<string>();
var cts = TaskHelper.Start(
    c =>   // [CancellationToken]
    {
        // Dieser Code wird im Worker-Thread ausgeführt
        foreach (string item in HeavilySearchThings())
        {
            list.Add(item);
            // Prüfen, ob abgebrochen werden soll
            if (c.IsCancellationRequested)
            {
                return;
            }
        }
    },
    t =>   // [Task]
    {
        // Dieser Code wird anschließend im UI-Thread ausgeführt
        // Dialog schließen, er wird nicht mehr benötigt
        dlg.Finish();
        if (t.IsCanceled)
        {
            // Der Hintergrund-Thread wurde abgebrochen
            App.InformationMessage("Die Suche wurde abgebrochen.");
        }
        else if (t.Exception != null)
        {
            // Im Hintergrund-Thread ist eine unbehandelte Ausnahme aufgetreten
            App.ErrorMessage("Das hat nicht funktioniert.", t.Exception);
        }
        else
        {
            // Alles in Ordnung, das Ergebnis kann jetzt angezeigt werden
            PublicList = list;
        }
    });
// Währenddessen einen Aktivitätsdialog anzeigen, der einen Abbruch-Button hat
if (dlg.ShowDialog() == false)
{
    // Hintergrundaktivität abbrechen, wenn der Dialog vom Benutzer abgebrochen wurde
    cts.Cancel();   // [CancellationTokenSource]
}

// Zuerst andere GUI-Ereignisse abarbeiten (blockiert):
TaskHelper.DoEvents();

// Zuerst andere GUI-Ereignisse bis zu einer bestimmten DispatcherPriority abarbeiten (blockiert):
TaskHelper.DoEvents(DispatcherPriority.DataBind);

// Vorgang ausführen, wenn andere Ereignisse bis zur Loaded-Priorität abgearbeitet wurden:
TaskHelper.WhenLoaded(() => SelectItemFromList());

// Vorgang ausführen, wenn alle anderen Ereignisse abgearbeitet wurden:
TaskHelper.Background(() => SelectItemFromList());

Download

TaskHelper.cs5,6 KiBQuelltext der TaskHelper-Klasse

Änderungen

2015Aug27
Added the AppDispatch method for easy WPF application dispatching.

Lizenz und Nutzungsbedingungen

Vervielfältigung und Weiterverbreitung dieser Datei, verändert oder unverändert, sind gestattet, vorausgesetzt die Urheberrechtsangabe und dieser Hinweis bleiben erhalten. Diese Datei wird wie vorliegend ohne jegliche Garantie oder Gewährleistung angeboten. (GNU All-Permissive-Lizenz)

Statistische Daten

  • Erstellt am 2012-09-12, aktualisiert am 2015-08-27.