Heim >Backend-Entwicklung >C++ >Warum führt das Aufrufen von '.Result' bei einer 'async` -Aufgabe zu Deadlocks in C#?
Deadlocks mit await
und .Result
in C#
Ihr Test hängt an CheckStatus().Result
aufgrund eines grundlegenden Missverständnisses der asynchronen Programmierung in C#. Lassen Sie uns das Problem klarstellen.
asynchrone Operationen in C#
Asynchrones Programmieren ermöglicht es den Vorgängen, gleichzeitig den Hauptfaden zu blockieren. async
und await
sind die Schlüsselwörter, die dies in C#ermöglichen.
Die Rolle von await
await
pausiert die Ausführung innerhalb einer async
-Methode, bis die erwartete Aufgabe beendet ist. Entscheidend ist, dass der Haupt -Thread nicht blockiert bleibt, sodass anderer Code ausgeführt werden kann.
Die Fallstricke von .Result
Die .Result
Eigenschaft eines Task
-Objekts ruft jedoch das Ergebnis synchron ab. Dies bedeutet, dass der aufrufende Thread blockiert ist, bis die Aufgabe abgeschlossen ist. Dieses Blockierverhalten ist die Hauptursache für Deadlocks, wenn sie mit await
.
Das Deadlock -Szenario
in Ihrem fehlenden Test erzwungen CheckStatus().Result
erzwingt die synchrone Ausführung der async
-Methode. Vor diesem Abschluss wird ein weiterer await CheckStatus()
versucht. Dieser zweite await
schlägt fehl
.Result
Um Deadlocks zu verhindern, verwenden Sie konsistent
, um Ergebnisse aus Methoden zu verarbeiten. Vermeiden Sie es direkt, await
direkt anzurufen. Dies stellt sicher
Das obige ist der detaillierte Inhalt vonWarum führt das Aufrufen von '.Result' bei einer 'async` -Aufgabe zu Deadlocks in C#?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!