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:
Beispiel
Das folgende Beispiel zeigt die verschiedenen Anwendungsmöglichkeiten von TaskHelper:
// 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
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.