【问题标题】:How to show the status of an internet connection?如何显示互联网连接的状态?
【发布时间】:2017-10-07 18:28:48
【问题描述】:

我想知道如何在 WPF C# 中显示互联网连接的状态?

我想要做的是,如果连接可用,圆形文本框将显示绿色,否则显示红色。我已经有了圆形文本框。我对代码如何能够继续检查连接感到困惑?现在它只是检查编译时间,就是这样。我仍在尝试了解这一切是如何工作的,因此,任何关于如何以不同方式完成的建议都将受到高度赞赏!

编辑:我的代码目前看起来像这样。

public LoginWindow()
{
     InitializeComponent();
     username.Focus();

     NetworkChange.NetworkAvailabilityChanged += OnNetworkAvailabilityChanged;
     var isAvailable = NetworkInterface.GetIsNetworkAvailable();
     OnNetworkAvailabilityChanged(isAvailable);
}

public void OnNetworkAvailabilityChanged(bool isAvailable)
{
    if (isAvailable == true)
    {
        wifiAvailability.Background = Brushes.LightGreen;
    }
    else
    {
        wifiAvailability.Background = Brushes.Red;
    }
}

public void OnNetworkAvailabilityChanged(object obj, NetworkAvailabilityEventArgs eventArgs)
{
        OnNetworkAvailabilityChanged(eventArgs.IsAvailable);
}

编辑:例外是“System.InvalidOperationException:调用线程无法访问此对象,因为不同的线程拥有它”。

根据 Internet 连接是否可用,异常发生在 public void OnNetworkAvailabilityChanged(bool isAvailable) 方法的 if 语句内。

【问题讨论】:

  • 呃,我不认为这是在编译时检查。我猜你只是在启动时调用这个方法一次?也许你应该改用定时器。
  • 也许事件在与 UI 线程不同的线程上执行。你确定代码是在正确的线程上执行的吗?

标签: c# wpf


【解决方案1】:

您可以使用NetworkChange.NetworkAvailabilityChanged。它会在每次网络状态更改时触发,因此不需要计时器或任务。

NetworkChange.NetworkAvailabilityChanged += (obj, eventArgs) =>
{
    if (eventArgs.IsAvailable)
    {
        // Change color to available
        return;
    }

    //Change color to unavailable
};

如果你想让它更干净,你可以把它移到一个单独的方法中。

NetworkChange.NetworkAvailabilityChanged += NetworkAvailabilityChanged;

public void NetworkAvailabilityChanged(object obj, NetworkAvailabilityEventArgs eventArgs) {}

编辑:

它不会立即触发,因为它只会在更改时触发。如果你想立即检查网络,你可以扩展它,例如这样:

public YourConstructor()
{   
    NetworkChange.NetworkAvailabilityChanged += OnNetworkAvailabilityChanged;
    var isAvailable = System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();
    OnNetworkAvailabilityChanged(isAvailable);
}

public void OnNetworkAvailabilityChanged(bool isAvailable)
{
    if (isAvailable)
    {
        //
    }
    else
    {
        //
    }
}

public void OnNetworkAvailabilityChanged(object obj, NetworkAvailabilityEventArgs eventArgs)
{
    OnNetworkAvailabilityChanged(eventArgs.IsAvailable);
}

编辑2: 我没有这个问题,但NetworkChange.NetworkAvailabilityChanged 是从另一个线程调用的。您可以在UI 线程上更新UI 。为了实现这一点,您必须调用调度程序以在 UI 线程上调用您的代码,如下所示:

public void OnNetworkAvailabilityChanged(bool isAvailable)
{
    Application.Current.Dispatcher.Invoke(() => {
        if (isAvailable)
        {
            // Change color to available
            return;
        }

        //Change color to unavailable
    });
}

【讨论】:

  • 我会在构造函数中放置 NetworkChange.NetworkAvailabilityChanged += NetworkAvailabilityChanged 部分吗?我有点不确定应该如何实施。我在活动方面工作不多。
  • 是的,你可以把它放在它应该开始监听变化的地方。在您使用 NetworkChange.NetworkAvailabilityChanged -= NetworkAvailabilityChanged 取消订阅或关闭程序之前,它不会被处理。
  • 我将它放在构造函数中,因为我猜这是有道理的,因此它在运行程序时立即开始侦听,但是在启动时没有真正发生任何事情。如果我更改我的互联网连接,我会收到此错误“System.InvalidOperationException”。
  • 请使用您当前拥有的代码更新您的问题。
  • 如果你想立即检查这个,你必须稍微修改一下代码。我提供了一个例子。
【解决方案2】:

您可以实现这个受信任的代码。

如果您需要它进行冗余检查,您可以在每 n 秒或每分钟执行一次的线程中调用它:

private bool CheckConnection(String URL)
{
    try
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
        request.Timeout = 5000;
        request.Credentials = CredentialCache.DefaultNetworkCredentials;
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();

        return response.StatusCode == HttpStatusCode.OK;
    }
    catch
    {
        return false;
    }
}

【讨论】:

  • 你可以用简单的return response.StatusCode == HttpStatusCode.OK;替换if
  • 确定可以退货。
  • 这会检查与特定网络资源的连接,而不是一般网络可用性。
猜你喜欢
  • 2018-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-03
相关资源
最近更新 更多