Heim >Backend-Entwicklung >C++ >Warum ruft mein httpclient.getAsync auf, wenn ich Await/Async in ASP.NET verwendete?

Warum ruft mein httpclient.getAsync auf, wenn ich Await/Async in ASP.NET verwendete?

DDD
DDDOriginal
2025-01-25 13:23:08750Durchsuche

Why Does My HttpClient.GetAsync Call Hang When Using Await/Async in ASP.NET?

Der Grund, warum HttpClient.GetAsync(...) hängt, wenn Await/Async in ASP.NET verwendet wird

In ASP.NET kann jeweils nur ein Thread eine Anfrage bearbeiten. Obwohl eine parallele Verarbeitung möglich ist, besitzt nur ein Thread den Anforderungskontext. Diese Thread-Verwaltung wird vom ASP.NET SynchronizationContext gesteuert.

Wenn Methoden auf eine Aufgabe warten, werden sie normalerweise im erfassten SynchronizationContext (oder im TaskScheduler, falls dieser nicht vorhanden ist) fortgesetzt. Dies steht im Einklang mit dem erwarteten Verhalten asynchroner Controller-Operationen.

Problem in Testfall 5

Der Deadlock in Test5Controller.Get ist auf die folgende Reihenfolge zurückzuführen:

  1. Rufen Sie HttpClient.GetAsync im ASP.NET-Anforderungskontext auf.
  2. HttpClient.GetAsync sendet eine HTTP-Anfrage und gibt eine nicht abgeschlossene Aufgabe zurück.
  3. AsyncAwait_GetSomeDataAsync wartet auf eine Aufgabe und gibt eine unvollendete Aufgabe zurück, da die Anfrage noch in Bearbeitung ist.
  4. Test5Controller.Get blockiert den aktuellen Thread, bis die von AsyncAwait_GetSomeDataAsync zurückgegebene Aufgabe abgeschlossen ist.
  5. HTTP-Antwort empfangen, HttpClient.GetAsync-Aufgabe abgeschlossen.
  6. AsyncAwait_GetSomeDataAsync versucht, im Kontext einer ASP.NET-Anfrage fortzufahren.
  7. Ein Deadlock tritt auf, weil der in Test5Controller.Get blockierte Thread immer noch den Anforderungskontext enthält.

Lösen Sie das Problem

Es gibt einige Best Practices, die implementiert werden können, um ähnliche Probleme zu vermeiden:

  • Verwenden Sie „ConfigureAwait(false)“ in asynchronen Bibliotheksmethoden, um Fortsetzungen außerhalb des ASP.NET-Anforderungskontexts zu versenden.
  • Vermeiden Sie das Blockieren von Aufgaben, indem Sie „await“ anstelle von „GetResult“ oder „Task.Wait“ verwenden.

Fazit

Das Verständnis der Rolle von SynchronizationContext und der Best Practices für die Verwendung der Async/Await-Technologie kann einen effizienten und Deadlock-freien Betrieb bei der Arbeit mit asynchronem Code in ASP.NET gewährleisten.

Das obige ist der detaillierte Inhalt vonWarum ruft mein httpclient.getAsync auf, wenn ich Await/Async in ASP.NET verwendete?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn