我想知道如何在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语句中。
答案 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;
}
}