在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);
它挂在await
但http调用实际上几乎立即返回(通过小提琴确认); 就好像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如何同步并行线程,并给出了我自己的问题给出了一些最佳实践。
- findObjectsInBackgroundWithBlock:从Parse获取数据,但数据只存在于块内
- 从asynchronousJavaScript方法返回值?
- 哪些浏览器支持<script async =“async”/>?
- TaskCompletionSource:何时使用SetResult()与TrySetResult()等
- 如何创build一个asynchronous方法
- 我怎样才能让jQuery执行同步而不是asynchronous的Ajax请求?
- 使接口实现asynchronous
- Nodejs vs SignalR:为什么我们需要服务器端的JavaScript?
- 如何阐明asynchronous和并行编程之间的区别?