Async/wartet Deadlocks in C#
auf moderne Programmierung stützt sich stark von asynchronen Operationen, und die Schlüsselwörter von C#async
/await
bieten einen optimierten Ansatz. Eine unsachgemäße Nutzung kann jedoch zu Deadlocks führen. Lassen Sie uns ein gemeinsames Szenario untersuchen:
Betrachten Sie dieses Beispiel:
<code class="language-csharp">public ActionResult ActionAsync() { // DEADLOCK: Blocking on the async task var data = GetDataAsync().Result; return View(data); } private async Task<string> GetDataAsync() { // Simple asynchronous method var result = await MyWebService.GetDataAsync(); return result.ToString(); }</code>
Dieser Code versucht, Daten asynchron abzurufen, wartet jedoch synchron auf das Ergebnis mit .Result
, wodurch ein Deadlock erstellt wird. Der Deadlock entsteht wie folgt:
ActionAsync
ruft GetDataAsync
. GetDataAsync
initiiert eine asynchrone Webanforderung über MyWebService.GetDataAsync
. MyWebService.GetDataAsync
Gibt eine unvollständige Aufgabe zurück. GetDataAsync
Suspendiert und eine unvollständige Aufgabe an ActionAsync
. ActionAsync
Blöcke in der unvollständigen Aufgabe von GetDataAsync
, wobei der Kontext -Thread anhält. GetDataAsync
fortgesetzt. GetDataAsync
benötigt den Kontext -Thread, der durch ActionAsync
blockiert wird. ActionAsync
wartet auf GetDataAsync
, das auf den blockierten Kontext -Thread wartet. Dies zeigt die entscheidende Bedeutung der Vermeidung von synchronen Warten auf asynchronen Operationen innerhalb asynchroner Methoden. Lassen Sie den asynchronen Betrieb immer auf natürliche Weise abgeschlossen und verwenden Sie gegebenenfalls await
.
Das obige ist der detaillierte Inhalt vonWie kann Async/warten zu Deadlocks in C#?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!