2012-03-27 6 views
68

Ich habe einen Anruf, den ich von innerhalb einer Xaml-basierten, C# Metro-Anwendung auf dem Win8 CP machen; Dieser Aufruf trifft einfach einen Web-Service und gibt JSON-Daten zurück.Async-Aufruf mit erwarten in HttpClient nie 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 an der await aber die http Aufruf gibt eigentlich fast sofort (durch Fiedler bestätigt); es ist, als ob die await ignoriert wird und es einfach dort hängt.

Bevor Sie fragen - JA - die Private Network-Funktion ist aktiviert.

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

+1

Wie rufen Sie diese Async-Methode? Ist es nicht eine Ausnahme? – svick

Antwort

97

Check out this answer zu meiner Frage, die sehr ähnlich scheint.

Etwas zu versuchen: Anruf ConfigureAwait(false) auf die Aufgabe von GetStreamAsync() zurückgegeben. Z.B.

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

Ob dies sinnvoll ist, hängt davon ab, wie Ihr Code oben genannt wird - in meinem Fall den Aufruf der async Methode Task.GetAwaiter().GetResult() der Code verursacht zu hängen.

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

This MSDN post geht ein bisschen ins Detail darüber, wie .NET parallele Threads synchronisiert - und the answer given to my own question gibt einige Best Practices.

+7

Danke, fast async aufgegeben/warten Sie, bevor Sie dies sehen. – Den

+4

Ich auch! Warum ist das Zeug nicht besser dokumentiert? Nochmals vielen Dank –

+1

Wird es passieren, wenn es auf UI-Kontext und ASP.NET-Kontext ist? – machinarium

Verwandte Themen