如何显示互联网连接的状态?

时间:2017-10-07 18:28:48

标签: c# wpf

我想知道如何在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:调用线程无法访问此对象,因为另一个线程拥有它”。

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

2 个答案:

答案 0 :(得分: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);
}

EDIT2: 我没有这个问题,但是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
    });
}

答案 1 :(得分:-1)

您可以实施此受信任的代码。

如果需要它进行冗余检查,可以在每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;
    }
}