如何让C#程序持续更新标签颜色以实时显示Always-On VPN连接状态
实现Always-On VPN状态实时更新的解决方案
先修复原有检测函数的逻辑缺陷
原代码的CheckForVPNInterface存在逻辑问题:遍历网卡时只要遇到第一个不符合条件的网卡就会直接将状态设为未连接,哪怕后续存在符合条件的VPN网卡也不会正确识别,先修正这个问题:
public bool CheckForVPNInterface() { // 先设置默认未连接状态 Label_Connection.BackColor = Color.Red; Button_ConnectVPN.Text = "Connect"; if (!NetworkInterface.GetIsNetworkAvailable()) { return false; } NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces(); foreach (NetworkInterface networkInterface in interfaces) { if (networkInterface.Description.Contains("Always-On VPN") && networkInterface.OperationalStatus == OperationalStatus.Up) { Label_Connection.BackColor = Color.Green; Button_ConnectVPN.Text = "Disconnect"; return true; } } return false; }
方案1:使用Timer定时轮询(实现最简单,适配绝大多数场景)
对实时性要求不高的场景可以选这个方案,设置1-2秒的轮询间隔完全够用:
- 在窗体类中声明Timer控件:
private System.Windows.Forms.Timer _vpnStatusCheckTimer;
- 在窗体的
Load事件中初始化Timer并启动:
private void MainForm_Load(object sender, EventArgs e) { // 启动时先执行一次检测 CheckForVPNInterface(); // 初始化定时器,间隔设为1000毫秒(1秒) _vpnStatusCheckTimer = new System.Windows.Forms.Timer(); _vpnStatusCheckTimer.Interval = 1000; _vpnStatusCheckTimer.Tick += (s, args) => CheckForVPNInterface(); _vpnStatusCheckTimer.Start(); }
- 窗体关闭时释放Timer资源避免内存泄漏:
private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { _vpnStatusCheckTimer?.Stop(); _vpnStatusCheckTimer?.Dispose(); }
方案2:监听系统网络变更事件(效率更高,实时性更好)
不需要持续轮询,只有当系统网络状态发生变化时才触发检测,资源占用更低:
- 在窗体
Load事件中注册网络变更通知:
using System.Net.NetworkInformation; private void MainForm_Load(object sender, EventArgs e) { // 启动时先执行一次检测 CheckForVPNInterface(); // 注册网络地址变更和网络可用性变更事件 NetworkChange.NetworkAddressChanged += NetworkChange_NetworkStatusChanged; NetworkChange.NetworkAvailabilityChanged += NetworkChange_NetworkStatusChanged; }
- 实现事件处理方法,触发时执行状态检测:
private void NetworkChange_NetworkStatusChanged(object sender, EventArgs e) { // 网络变更事件可能在非UI线程触发,需要Invoke到UI线程更新控件 if (InvokeRequired) { Invoke(new Action(() => CheckForVPNInterface())); return; } CheckForVPNInterface(); }
- 窗体关闭时注销事件避免内存泄漏:
private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { NetworkChange.NetworkAddressChanged -= NetworkChange_NetworkStatusChanged; NetworkChange.NetworkAvailabilityChanged -= NetworkChange_NetworkStatusChanged; }
内容的提问来源于stack exchange,提问作者wads
相关产品推荐
相关产品推荐

