kei*_*en7 88 c# asynchronous async-await dotnet-httpclient
我正在C#
Win8 CP上基于xaml的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);
Run Code Online (Sandbox Code Playgroud)
它挂起,await
但http呼叫几乎立即返回(通过提琴手确认); 就好像await
被忽略了它只是挂在那里.
在您询问之前 - 是 - 打开了专用网络功能.
任何想法为什么会挂起?
Ben*_*Fox 123
查看我的问题的答案,这似乎非常相似.
要尝试的东西:调用ConfigureAwait(false)
返回的任务GetStreamAsync()
.例如
var result = await httpClient.GetStreamAsync("weeklyplan")
.ConfigureAwait(continueOnCapturedContext:false);
Run Code Online (Sandbox Code Playgroud)
这是否有用取决于你的代码是如何被调用的 - 在我的情况下调用async
方法Task.GetAwaiter().GetResult()
使得代码挂起.
这是因为GetResult()
在任务完成之前阻塞当前线程.当任务完成时,它会尝试重新进入启动它的线程上下文,但不能,因为在该上下文中已经存在一个线程,这被调用GetResult()
... 死锁!
这篇MSDN文章详细介绍了.NET如何同步并行线程 - 给出了我自己的问题的答案给出了一些最佳实践.
请注意-如果您错过了ASP.NET控制器顶层的等待,并且返回了任务而不是结果作为响应,则它实际上只是挂在嵌套的await调用中而没有任何错误。一个愚蠢的错误,但是如果我看过这篇文章,它可能节省了我一些时间检查代码是否有奇怪的地方。
归档时间: |
|
查看次数: |
52281 次 |
最近记录: |