我在某个页面的 LoadState 方法中执行异步请求。我使用 HttpClient 发出请求,我希望在等待结果时闪屏会消失。
如果我没有连接到任何网络,则启动画面会立即消失,并且我会得到一个空白页面,因为请求显然没有发生。
但是,如果我连接到网络但存在连接问题(例如,我设置了错误的 IP 地址),它似乎会启动一个请求并阻止。
我的期望是 HttpClient 会意识到它不能发送请求并且要么抛出异常,要么只返回一些东西。
我设法通过设置大约 800 毫秒的超时来解决阻塞问题,但是现在当 Internet 连接正常时它无法正常工作。这是最好的解决方案,我应该设置超时吗?什么是合适的超时时间,这将使我能够区分无限期阻塞调用和仅在较慢网络上的正确调用?
我也许可以在每次请求之前检查互联网连接,但这听起来像是一个不可预测的解决方案......
编辑:现在,这真的很有趣。我又试了一次,它在这一点上阻塞:
var rd = await httpClient.SendAsync(requestMsg);
如果我按照评论中的建议使用 Task.Run() 并获得一个新线程,那么它总是可以的。
但是,如果没有 Internet 访问权限但网络访问权限不是“受限”(它表示 IPv4 连接是“Internet 访问权限”,尽管我无法在浏览器中打开单个网站并且没有数据,那么没有 Task.Run() 也可以从 Web 服务返回。它只是抛出 System.Net.Http.HttpRequestException,这是我一开始就期待的)只有在网络连接受限时才会阻塞。
最佳答案
如果不是设置超时,而是使用检查连接状态怎么办
public static bool IsConnected
{
get
{
return NetworkInformation.GetInternetConnectionProfile() != null;
}
}
这样,如果 IsConnected,则您调用电话;否则,忽略它。
我不确定您是否在 App.xaml.cs 中运行它?我发现在该类中发出的请求可能变化无常,最好将功能移动到扩展的初始屏幕,以确保应用程序在激活过程中一直运行。
http://msdn.microsoft.com/en-us/library/windows/apps/xaml/Hh868191(v=win.10).aspx
关于windows-8 - WinRT HttpClient 阻止启动画面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14444431/