Ich habe eine Task
, die ich beginne und möchte auf den Abschluss in einer WPF App warten. In dieser Aufgabe rufe ich eine Action
auf dem Dispatcher auf.Task.Wait vs Task.RunSyncronous wo Aufgabe hat WPF Dispatcher.Invoke
Wenn ich Task.Wait()
verwende, scheint es zu hängen, als ob die Methode nie beendet wurde. Breakpoints innerhalb des Dispatcher.Invoke werden auch nie getroffen.
Wenn ich Task.RunSyncronously()
verwende, scheint es richtig zu funktionieren und Breakpoints innerhalb des Dispatcher werden getroffen.
Warum gibt es einen Unterschied?
Codebeispiel unten:
public void ExampleMethod()
{
// When doing the following:
var task = new Task(LoadStuff);
// This never returns:
task.Start();
task.Wait();
// This version, however, does:
task.RunSyncronously();
}
private void LoadStuff()
{
ObservableCollection<StuffObj> stuff = Stuff.Load(arg1, true);
DispatchHelper.RunOnDispatcher(() =>
{
...
});
}
public static class DispatchHelper
{
public static void RunOnDispatcher(Action action)
{
Application.Current.Dispatcher.Invoke(action);
}
}
Meinst du nicht .NET 4.5, es gibt noch kein .NET 5. Außerdem generieren asynchrone Methoden eine Statusmaschine statt ContinueWith. –
@BrianReichle Ich meinte C#, nicht .NET, aber ja, es war falsch. Soweit "async", ja, erzeugt es eine Zustandsmaschine, und diese Zustandsmaschine fügt sich selbst als eine Fortsetzung der Aufgabe hinzu, die erwartet wird. Der Zustandsautomat ist der Mechanismus, mit dem er weiß, wo er beim Fortsetzen der Fortsetzung aufhört, aber das Hinzufügen einer Fortsetzung zu der Aufgabe, die erwartet wird, ist, wie alles läuft, wenn die Aufgabe beendet ist. – Servy
Die Zustandsmaschine plant über den von 'GetAwaiter()' zurückgegebenen Warter, nicht 'ContinueWith' (dies erlaubt uns, andere Dinge als Aufgaben abzuwarten). Sie rufen beide zu einer gemeinsamen Implementierung auf, aber "task.GetAwaiter(). OnCompleted (...)' ruft nicht "ContinueWith" auf (insbesondere vermeidet ersteres das Erstellen einer neuen Aufgabe). Aber ich nehme an, das wird nur pedantisch, die meisten Leute kümmern sich nicht um die Implementierungsdetails :) –