在HttpClient中等待的asynchronous调用永远不会返回

我正在Win8 CP上的基于xaml的C# metro应用程序中调用; 这个调用只是命中一个Web服务并返回JSON数据。

 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); 

它挂在awaithttp调用实际上几乎立即返回(通过小提琴确认); 就好像await被忽略了,只是挂在那里。

在您询问之前 – 是 – 专用networkingfunction打开。

任何想法,为什么这会挂?

看看这个答案 ,这似乎是非常相似的问题。

需要尝试的方法:调用GetStreamAsync()返回的Task上的ConfigureAwait(false) GetStreamAsync() 。 例如

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

是否有用取决于上面的代码是如何被调用的 – 在我的情况下,使用Task.GetAwaiter().GetResult()调用async方法Task.GetAwaiter().GetResult()导致代码挂起。

这是因为GetResult()阻塞当前线程,直到任务完成。 当任务完成时,它会尝试重新进入启动的线程上下文,但是不能,因为在上下文中已经存在一个线程,而这个线程被GetResult()的调用所阻塞… 死锁!

这篇MSDN文章详细介绍了.NET如何同步并行线程,并给出了我自己的问题给出了一些最佳实践。