通过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));
                }
            }
        }
    }

通过c#在Windows8中检查互联网连接失败

使用下面的代码,它应该解决你的问题…

  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线程上引发。与WinFormsWPF类似,您仍然只能访问UI线程上的控件。

要绕过这个方面,你必须调用UI线程类似于你如何在WinFormsWPF使用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));
  });
}