Heim > Backend-Entwicklung > C++ > Warum `httpclient.getAsync ()` Deadlock mit Async/wartet in .NET 4.5?

Warum `httpclient.getAsync ()` Deadlock mit Async/wartet in .NET 4.5?

DDD
Freigeben: 2025-01-25 13:31:10
Original
770 Leute haben es durchsucht

Why Does `HttpClient.GetAsync()` Deadlock with Async/Await in .NET 4.5?

.NET 4.5

und Async/Auseait verursachten tote Sperren HttpClient.GetAsync() im .NET 4.5, wenn die

-Klasses in Kombination mit dem

-Modus verwendet wird, kann in einigen Fällen das Ergebnis von HttpClient auf unbestimmte Zeit auftreten. In dem angegebenen Code wurde dieses Verhalten im Fall "Test5" beobachtet und verursachte das Problem, ob es in der async/await -Klasse Fehler oder die API gab. httpClient.GetAsync(...) HttpClient Der Grund für das Schloss

Dead Lock wird durch den Fadenkontext und den Synchronisationsmechanismus verursacht, der im -Modus verwendet wird. Wenn die ASP.NET -Anforderung darauf wartet, zu sein, wird diese Methode normalerweise auf dem erfassten

wiederhergestellt, um sicherzustellen, dass die Kontextreserven erforderlich sind.

async/await hat im Fall von Test5 jedoch Task einen Blockierungsvorgang gestartet, wenn er auf die Ergebnisse von SynchronizationContext wartete, dh

. Dies blockiert Threads mit Anforderungskontext und verhindert die Fertigstellung von

im Kontext. AsyncAwait_GetSomeDataAsync HttpClient.GetAsync Test5Controller.Get Task

Um diesen Deadloc zu vermeiden, wird empfohlen, die folgenden Best Practice zu verwenden:

Verwenden Sie

in der asynchronen Methode der "Bibliothek" wie möglich. Auf diese Weise können Sie weiterhin auf normalen Thread -Pool -Threads ausgeführt werden und den ASP.NET -Anforderungskontext umgehen.

Obstruktionsbetrieb vermeiden;
  • ConfigureAwait(false) Wenn Sie diese Praktiken befolgen, können Sie gleichzeitig die beiden Vorteile der Verwendung von
  • nutzen: Wenn Sie auf einem separaten Thread -Pool -Thread ausgeführt werden, wird fortgesetzt, ohne dass ASP.NET -Anforderungen erforderlich sind, und halten Sie den Controller selbst asynchron Um das Blockieren von Threads zu verhindern

Das obige ist der detaillierte Inhalt vonWarum `httpclient.getAsync ()` Deadlock mit Async/wartet in .NET 4.5?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage