Debuggen des CheckStatusTwiceResultTest
Deadlock
Dieser Artikel analysiert einen Deadlock, der im Unit -Test auftritt. Die ersten drei Tests (CheckStatusTwiceResultTest
, CheckOnceResultTest
und CheckOnceAwaitTest
) laufen erfolgreich aus, aber CheckStatusTwiceAwaitTest
hängt. Dies weist auf ein Problem hin, das sich aus der kombinierten Verwendung von CheckStatusTwiceResultTest
und Result
ergibt, um auf die await
-Methode zuzugreifen. CheckStatus
Das Problem: und Task.Result
await
-Objekts blockiert den aufrufenden Thread, bis die Aufgabe abgeschlossen ist. In diesem Fall versucht Result
, das Ergebnis der asynchronen Task
-Methode synchron zu synchron. Dieser synchrone Zugriff in einem asynchronen Kontext ist die Grundursache des Deadlocks. CheckStatus().Result
CheckStatus
ConfigureAwait(false)
Um Deadlocks beim synchronen Zugriff auf eine Aufgabe zu verhindern, verwenden Sie
) würde das Hinzufügen von ConfigureAwait(false)
wahrscheinlich den Deadlock auflösen. ExecuteTaskAsync
ConfigureAwait(false)
vermeiden Sie
und im asynchronen Code. await
eignet sich am besten für asynchrone Operationen, während Result
für synchrone Kontexte geeignet ist. Diese Trennung verbessert die Klarheit der Code und verhindert Deadlocks. await
Kurz gesagt, der Deadlock in Result
ergibt sich aus der falschen Verwendung von
eliminiert solche Deadlocks in der asynchronen Programmierung. CheckStatusTwiceResultTest
Das obige ist der detaillierte Inhalt vonWarum `checkStatustwiceresultest' Deadlock ', wenn sowohl' Warte 'als auch' result 'verwendet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!