Deadlocks in Async/Warte (C#)
Deadlocks sind ein häufiges Problem bei der Verwendung von C#'s async
/await
in Single-Threaded-Kontexten wie UI-Threads oder ASP.NET-Anforderungskontexten. Dies geschieht, weil der Synchronisationskontext mit asynchronen Operationen interagiert.
Die Wurzel des Deadlocks
Ein Deadlock entsteht, wenn eine asynchrone Methode, beispielsweise GetDataAsync
, synchron genannt wird und dann ihr Ergebnis mit .Result
erwartet wird. Dies blockiert den einzelnen Thread. Da die Fortsetzung von GetDataAsync
denselben Thread (den erfassten Synchronisationskontext) benötigt, kann er nicht ausgeführt werden, wodurch ein Deadlock erstellt wird.
Die Lösung: Nicht blockierende Ansätze
Der Schlüssel, um dies zu vermeiden, besteht darin, das Blockieren des einzelnen Fadens zu vermeiden. Verwenden Sie einen nicht blockierenden Ansatz:
, anstatt synchron zu warten, bis der asynchronisierte Betrieb abgeschlossen ist:<code class="language-csharp">public ActionResult ActionAsync() { // NON-BLOCKING ASYNC OPERATION GetDataAsync().ContinueWith(task => { var data = task.Result; // Access result safely here return View(data); }); return View();//or some other non-blocking return }</code>
ContinueWith
hier, GetDataAsync
plant eine Fortsetzung, die einmal return View()
abgeschlossen wird. Dadurch wird der Hauptfaden freigesetzt, sodass die Fortsetzung beim Abschluss der asynchronen Operation auf demselben Faden ausgeführt wird. Dies verhindert die Deadlock. Beachten Sie, dass der Ok()
möglicherweise je nach spezifischem Rahmen und gewünschtem Verhalten angepasst werden muss. Eine angemessenere Rendite kann je nach Kontext
Das obige ist der detaillierte Inhalt vonWie können Async/Wartedlecken in einem Thread-Kontexten vermieden werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!