Task.Delay wird nie abgeschlossen

7

Der folgende Code wird für immer einfrieren.

%Vor%

Wenn ich den Aufruf mit dem auskommentierten Code in DoSomethingAsync umschalte, verhält es sich wie erwartet. Ich vermute, dass irgendwie die verschachtelten Warten einen Deadlock verursachen, aber ich bin mir nicht sicher warum oder wie ich es beheben kann.

    
Matthew Finlay 02.07.2014, 07:42
quelle

1 Antwort

22

Wenn Button_Click im Thread GUI ausgeführt wird, liegt ein Deadlock vor.

Wenn Sie Wait für eine Aufgabe verwenden, blockieren Sie den Thread synchron, bis die Aufgabe endet, aber die Aufgabe wird niemals enden, da die Fortsetzung (der Abschluss von Task.Delay(2000); ) ebenfalls auf dem GUI-Thread ausgeführt werden muss ist blockiert auf Wait).

Sie haben mehrere Lösungen. Verwenden Sie ConfigureAwait(false) , um den SynchronizationContext des GUI-Threads nicht zu erfassen:

%Vor%

Oder (was ich empfehle) benutze einen async void Event-Handler (was der einzige geeignete Platz für eine async void -Methode ist):

%Vor%     
i3arnon 02.07.2014, 19:57
quelle