Gibt es eine "Standard" -Methode, um anzugeben, dass eine Aufgabenfortsetzung auf dem Thread ausgeführt werden soll, aus dem die ursprüngliche Aufgabe erstellt wurde?
Derzeit habe ich den folgenden Code - er funktioniert, aber den Dispatcher im Auge zu behalten und eine zweite Aktion zu erstellen, scheint unnötiger Aufwand zu sein.
dispatcher = Dispatcher.CurrentDispatcher;
Task task = Task.Factory.StartNew(() =>
{
DoLongRunningWork();
});
Task UITask= task.ContinueWith(() =>
{
dispatcher.Invoke(new Action(() =>
{
this.TextBlock1.Text = "Complete";
}
});
Control.Invoke(Action)
, dh.TextBlock1.Invoke
eher alsdispatcher.Invoke
Antworten:
Nennen Sie die Fortsetzung mit
TaskScheduler.FromCurrentSynchronizationContext()
:Dies ist nur geeignet, wenn sich der aktuelle Ausführungskontext im UI-Thread befindet.
quelle
await
ist ein gutes Muster - aber nur, wenn Sie sich in einemasync
Kontext befinden (z. B. einer deklarierten Methodeasync
). Wenn nicht, ist es immer noch notwendig, so etwas wie diese Antwort zu tun.Mit Async machen Sie einfach:
Jedoch:
quelle
false
Version verwirrt mich. Ich dachtefalse
, es könnte in einem anderen Thread weitergehen.async
Methode zu sein (was für die Verwendung erforderlich istawait
). Was ist die Antwort, wenn sieawait
nicht verfügbar ist?Wenn Sie einen Rückgabewert haben, den Sie an die Benutzeroberfläche senden müssen, können Sie die generische Version wie folgt verwenden:
Dies wird in meinem Fall von einem MVVM ViewModel aufgerufen.
quelle
Ich wollte nur diese Version hinzufügen, weil dies ein so nützlicher Thread ist und ich denke, dass dies eine sehr einfache Implementierung ist. Ich habe dies mehrfach in verschiedenen Arten von Multithread-Anwendungen verwendet:
quelle
TaskScheduler
ist Teil von BCL,Dispatcher
ist es nicht) und kann zum Erstellen komplexer Aufgabenketten verwendet werden, da keine asynchronen Operationen zum Feuern und Vergessen (wie z. B.BeginInvoke
) erforderlich sind .Ich bin über Google hierher gekommen, weil ich nach einer guten Möglichkeit gesucht habe, Dinge
await
im UI-Thread zu tun, nachdem ich mich in einem Task.Run-Aufruf befunden habe. Mit dem folgenden Code können Sie wieder zum UI-Thread zurückkehren.Ich hoffe das hilft jemandem.
Verwendung:
quelle
static
die Klasse zu machenUI
.