通过c#在Windows8中检查互联网连接失败
本文关键字:互联网 连接 失败 检查 Windows8 通过 | 更新日期: 2023-09-27 17:53:35
我正在尝试从我的c#应用程序测试Windows8中的互联网连接。我有一个布尔类型的变量,它返回连接状态。当布尔值为true时:什么都不做。当布尔值变为false时,加载我的"NetworkDisconection
"页面。但是,当我调试这一行时:
if (this.Frame != null)
我得到一个异常:
应用程序调用为不同线程编组的接口。(Exception from HRESULT: 0x8001010E (rpce_wrong_thread))
是的,这个方法在另一个线程上。我该如何解决这个问题?
private bool bConection;
public HUB()
{
this.InitializeComponent();
bConection = NetworkInformation.GetInternetConnectionProfile()!= null;
NetworkInformation.NetworkStatusChanged += NetworkInformation_NetworkStatusChanged;
}
void NetworkInformation_NetworkStatusChanged(object sender)
{
if (NetworkInformation.GetInternetConnectionProfile() == null)
{
if (bConection == false)
{
bConection = true;
}
}
else
{
if (bConection == true)
{
bConection = false;
if (this.Frame != null)
{
Frame.Navigate(typeof(NetworkDisconection));
}
}
}
}
使用下面的代码,它应该解决你的问题…
Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
if (this.Frame != null)
{
Frame.Navigate(typeof(NetworkDisconection));
}
});
您应该能够直接获得Dispatcher,因为它看起来像您的代码在XAML页面的代码后面(参考this.Frame)。
在c# Win8开发论坛中可以找到大量的好信息。搜索Dispatcher,您将找到一些关于它的讨论。与往常一样,请查看GenApp以获取其他重要资源。NetworkInformation.NetworkStatusChanged
事件在非ui线程上引发。与WinForms和WPF类似,您仍然只能访问UI线程上的控件。
要绕过这个方面,你必须调用UI线程类似于你如何在WinForms或WPF使用this.Invoke
/this.Dispatcher.Invoke
。
一开始你可能会尝试使用Window.Current.Dispatcher.RunAsync()
,但你会注意到Window.Current
在这里总是null
。
相反,您应该在Windows.ApplicationModel.Core
名称空间中使用CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync()
。是的,这确实有点拗口所以我推荐这个助手方法在 app。cs。
using Windows.ApplicationModel.Core;
using Windows.UI.Core;
public static IAsyncAction ExecuteOnUIThread(DispatchedHandler action)
{
var priority = CoreDispatcherPriority.High;
var dispatcher = CoreApplication.MainView.CoreWindow.Dispatcher;
return dispatcher.RunAsync(priority, action);
}
我也推荐这个辅助方法:
public static bool CheckInternetAccess()
{
var profile = NetworkInformation.GetInternetConnectionProfile();
if (profile == null) return false;
var connectivityLevel = profile.GetNetworkConnectivityLevel();
return connectivityLevel.HasFlag(NetworkConnectivityLevel.InternetAccess);
}
最后:
async void NetworkInformation_NetworkStatusChanged(object sender)
{
var isConnected = CheckInternetAccess();
await ExecuteOnUIThread(() =>
{
if (!isConnected && this.Frame != null)
this.Frame.Navigate(typeof(ConnectionLostPage));
});
}