Windows 8 WinRT HttpClient块显示屏幕

Windows 8 WinRT HttpClient块显示屏幕,windows-8,windows-runtime,winrt-xaml,Windows 8,Windows Runtime,Winrt Xaml,我在某个页面的LoadState方法中执行异步请求。我使用HttpClient发出请求,我希望在等待结果时splashscreen会消失 如果我没有连接到任何网络,splashscreen会立即消失,我会得到一个空白页面,因为请求显然没有发生 但是,如果我连接到一个网络,但有连接问题(例如,我设置了一个错误的IP地址),它似乎启动了一个请求,只是阻塞了 我的期望是HttpClient会意识到它不能发送请求,或者抛出异常,或者只是返回一些东西 我通过设置大约800毫秒的超时来解决阻塞问题,但现在当

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

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

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

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

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

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

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

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;
        }
    }
这样,如果断开连接,则您拨打电话;否则,忽略它

我不确定您是否正在App.xaml.cs中运行此功能?我发现在该类中发出的请求可能是变化无常的,最好将该功能移到扩展的启动屏幕上,以确保应用程序在激活过程中始终保持不变


您如何发出请求?也许您的操作方式会阻止UI线程?你能试着从后台线程开始吗,例如使用
Task.Run()
?谢谢,我试过了,并对我的问题进行了更详细的编辑。看看我对一个类似问题的回答,它可能不会让你满意,但如果Task.Run()解决方案有效,它会给出这个问题的可能原因,那么为什么不总是使用它呢?SendAsync可能没有正确实现,在某些情况下它会阻止调用线程,而实际上它应该异步执行任何操作。这在
Debug
模式下可能是预期的。你在发布模式下试过了吗?我确实检查过网络连接,但它仍然会发生,而且很奇怪,很难重现。