Heim >Backend-Entwicklung >C++ >Wie können asynchrone Deadlocks in C#'`async`/` ay auftreten und wie können sie vermieden werden?
asynchrische Deadlocks in C#: Ein Synchronisationskontext -Problem
c#'s Synchronisationskontexte stellen sicher, dass der Code im richtigen Thread ausgeführt wird, aber Probleme treten mit nicht-rezentranten oder einzelnen Thread-Kontexten wie dem UI-Thread oder dem ASP.NET-Anforderungskontext auf. async
await
Betrachten Sie dieses Szenario:
hier,
<code class="language-csharp">public ActionResult ActionAsync() { var data = GetDataAsync().Result; // Blocking call! return View(data); } private async Task<string> GetDataAsync() { var result = await MyWebService.GetDataAsync(); return result.ToString(); }</code>blockiert, während Sie
erwarten. ActionAsync
selbst erwartet eine Hintergrundaufgabe. Dies schafft einen Deadlock: Der Haupt -Thread (in GetDataAsync
) wird blockiert, wodurch die Hintergrundaufgabe abgeschlossen wird, was wiederum verhindert, dass GetDataAsync
fertig ist, was zu einem ewigen Deadlock führt. ActionAsync
GetDataAsync
Der Deadlock geschieht, weil der Synchronisationskontext des Haupt -Threads während der
erfasst wird, was ihn von der Fertigstellung des Haupt -Threads abhängt. Da der Hauptfaden blockiert ist, verhindert diese Abhängigkeit await
abgeschlossen. GetDataAsync
GetDataAsync
Die Lösung für einsthread-Kontexte besteht darin, die Blockierung von Operationen innerhalb von
async
innerhalb .Result
, um dieses spezifische Beispiel zu lösen. await
Das obige ist der detaillierte Inhalt vonWie können asynchrone Deadlocks in C#'`async`/` ay auftreten und wie können sie vermieden werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!