c# when Async-Aufruf mit Wartezeit in HttpClient wird nie zurückgegeben



when to use async c# (1)

Ich habe einen Anruf, den ich aus einer XAML-basierten C# -Metro-Anwendung auf dem Win8 CP heraus mache; Dieser Aufruf trifft einfach einen Web-Service und gibt JSON-Daten zurück.

HttpMessageHandler handler = new HttpClientHandler();

HttpClient httpClient = new HttpClient(handler);
httpClient.BaseAddress = new Uri("http://192.168.1.101/api/");

var result = await httpClient.GetStreamAsync("weeklyplan");
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(WeeklyPlanData[]));
return (WeeklyPlanData[])ser.ReadObject(result);

Es hängt bei der await aber der http- Aufruf kehrt tatsächlich fast sofort zurück (bestätigt durch Fiddler); es ist, als ob das await ignoriert wird und es einfach dort hängt.

Bevor Sie Fragen stellen - JA - ist die Funktion "Privates Netzwerk" aktiviert.

Irgendwelche Ideen, warum das hängen würde?


Sieh dir diese Antwort zu meiner Frage an, die sehr ähnlich zu sein scheint.

Etwas zum Ausprobieren: Rufen Sie ConfigureAwait(false) in der von GetStreamAsync() zurückgegebenen GetStreamAsync() . Z.B

var result = await httpClient.GetStreamAsync("weeklyplan")
                             .ConfigureAwait(continueOnCapturedContext:false);

Ob das nützlich ist oder nicht, hängt davon ab, wie der obige Code aufgerufen wird - in meinem Fall das Aufrufen der async Methode mit Task.GetAwaiter().GetResult() verursachte den Code zu hängen.

Dies liegt daran, dass GetResult() den aktuellen Thread blockiert, bis der Task abgeschlossen ist. Wenn die Task abgeschlossen ist, versucht sie, den Threadkontext, in dem sie gestartet wurde, erneut einzugeben, kann dies aber nicht, da in diesem Kontext bereits ein Thread vorhanden ist, der durch den Aufruf von GetResult() ... deadlock blockiert wird !

In diesem MSDN-Post wird ausführlich erläutert, wie .NET parallele Threads synchronisiert - und die Antwort auf meine eigene Frage gibt einige Best Practices.





dotnet-httpclient