4

我在某个页面的 LoadState 方法中执行异步请求。我使用 HttpClient 发出请求,我希望在等待结果时闪屏会消失。

如果我没有连接到任何网络,启动画面会立即消失,并且我会得到一个空白页面,因为请求显然没有发生。

但是,如果我连接到网络但有连接问题(例如,我设置了错误的 IP 地址),它似乎会启动一个请求并阻止。

我的期望是 HttpClient 会意识到它不能发送请求并且要么抛出异常,要么只返回一些东西。

我设法通过设置大约 800 毫秒的超时来解决阻塞问题,但现在当 Internet 连接正常时它无法正常工作。这是最好的解决方案,我应该设置超时吗?什么是适当的超时时间,这将使我能够区分无限期阻塞呼叫和仅在较慢网络上的正确呼叫?

我也许可以在每次请求之前检查互联网连接,但这听起来像是一个不可预测的解决方案......

编辑:现在,这真的很有趣。我又试了一次,它在这一点上阻塞:

var rd = await httpClient.SendAsync(requestMsg);

如果我按照评论中的建议使用 Task.Run() 并获得一个新线程,那么它总是可以的。但是,如果没有 Internet 访问权限但网络访问权限不是“受限”(它表示 IPv4 连接是“Internet 访问权限”,尽管我无法在浏览器中打开单个网站并且没有数据,那么没有 Task.Run() 也可以从 Web 服务返回。它只是抛出 System.Net.Http.HttpRequestException 这是我一开始就期待的)只有在网络连接受限时才会阻塞。

4

1 回答 1

1

如果不是设置超时,而是使用检查连接状态怎么办

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

于 2013-01-30T17:11:58.783 回答