You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用netsh进程获取WLAN信息致系统卡顿,寻求优化方案

优化netsh轮询WiFi信息的方案及替代思路

一、现有代码的进一步优化点

1. 复用ProcessStartInfo减少对象开销

当前每次循环都新建Process时重复配置ProcessStartInfo,可以把它提到类级别提前初始化,避免重复创建和配置的开销:

' 在类内部提前初始化,循环中直接复用
Private ReadOnly StartInfo As New ProcessStartInfo With {
    .Arguments = "wlan show interfaces",
    .CreateNoWindow = True,
    .UseShellExecute = False,
    .FileName = "netsh.exe",
    .RedirectStandardOutput = True
}

2. 修复字典对比逻辑的问题

当前对比逻辑存在两个问题:一是发现差异后直接赋值引用,会导致CurrentInfo和WlanInfo指向同一对象;二是未检查旧字典中存在但新字典中消失的键。优化后的对比逻辑如下:

HasChanges = False
' 检查新数据的键值是否有变化
For Each key In WlanInfo.Keys
    Dim existingValue As String = ""
    If Not CurrentInfo.TryGetValue(key, existingValue) OrElse existingValue <> WlanInfo(key) Then
        HasChanges = True
        Exit For
    End If
Next
' 检查新旧字典的键数量是否一致(处理键消失的情况)
If Not HasChanges AndAlso CurrentInfo.Count <> WlanInfo.Count Then
    HasChanges = True
End If

' 有变化时创建新字典赋值,避免引用关联
If HasChanges Then
    CurrentInfo = New Dictionary(Of String, String)(WlanInfo)
    RaiseEvent UpdateRequired(New Info(CurrentInfo))
End If

3. 调整轮询间隔降低系统负载

WiFi信号强度的变化频率远低于1秒,可将轮询间隔调整为2-3秒,减少netsh进程启动的频次,缓解卡顿。

4. 异步场景下避免阻塞线程池

如果后续换回异步实现,不要用Thread.Sleep,改用Await Task.Delay(2000),避免占用线程池线程。

二、替代方案:使用Windows原生WiFi API

直接调用Windows原生的WiFi Native API(如WlanOpenHandle、WlanGetAvailableNetworkList等),无需启动外部进程,性能远高于netsh轮询,彻底解决卡顿问题。

VB.NET简化示例(核心片段)

需要通过P/Invoke声明系统API:

Imports System.Runtime.InteropServices

Namespace Wifi
    Public Class NativeWifiSignal
        <DllImport("wlanapi.dll", SetLastError:=True)>
        Private Shared Function WlanOpenHandle(dwClientVersion As UInteger, pReserved As IntPtr, ByRef pdwNegotiatedVersion As UInteger, ByRef phClientHandle As IntPtr) As UInteger
        End Function

        <DllImport("wlanapi.dll", SetLastError:=True)>
        Private Shared Function WlanGetAvailableNetworkList(hClientHandle As IntPtr, pInterfaceGuid As Guid, dwFlags As UInteger, pReserved As IntPtr, ByRef ppAvailableNetworkList As IntPtr) As UInteger
        End Function

        <DllImport("wlanapi.dll", SetLastError:=True)>
        Private Shared Function WlanCloseHandle(hClientHandle As IntPtr, pReserved As IntPtr) As UInteger
        End Function

        ' 定义对应结构体与枚举(完整定义可参考MSDN文档)
        <StructLayout(LayoutKind.Sequential)>
        Private Structure WLAN_AVAILABLE_NETWORK
            Public wlanSignalQuality As UInteger ' 信号质量值:0-100
            ' 其他字段省略
        End Structure

        Public Function GetCurrentSignalStrength() As Integer
            Dim clientHandle As IntPtr = IntPtr.Zero
            Dim negotiatedVersion As UInteger = 0
            Dim result As UInteger = WlanOpenHandle(2, IntPtr.Zero, negotiatedVersion, clientHandle)
            If result <> 0 Then Return -1

            ' 此处需补充枚举WiFi接口GUID的逻辑(简化示例省略)
            Dim interfaceGuid As Guid = Guid.Empty

            Dim networkListPtr As IntPtr = IntPtr.Zero
            result = WlanGetAvailableNetworkList(clientHandle, interfaceGuid, 0, IntPtr.Zero, networkListPtr)
            If result <> 0 Then
                WlanCloseHandle(clientHandle, IntPtr.Zero)
                Return -1
            End If

            ' 解析第一个可用网络的信号强度
            Dim networkCount As UInteger = Marshal.ReadInt32(networkListPtr)
            If networkCount > 0 Then
                Dim networkSize As Integer = Marshal.SizeOf(GetType(WLAN_AVAILABLE_NETWORK))
                Dim firstNetworkPtr As IntPtr = IntPtr.Add(networkListPtr, 4)
                Dim network As WLAN_AVAILABLE_NETWORK = Marshal.PtrToStructure(Of WLAN_AVAILABLE_NETWORK)(firstNetworkPtr)
                WlanCloseHandle(clientHandle, IntPtr.Zero)
                Return CInt(network.wlanSignalQuality)
            End If

            WlanCloseHandle(clientHandle, IntPtr.Zero)
            Return -1
        End Function
    End Class
End Namespace

三、其他补充建议

  • 若坚持使用netsh,可缓存解析后的字段映射规则,避免每次重复处理字符串分割逻辑;
  • 程序退出时需主动停止轮询线程,防止资源泄漏;
  • 触发UI更新事件时,确保在UI线程执行(如用Control.Invoke或Dispatcher.Invoke),避免跨线程操作异常。

内容的提问来源于stack exchange,提问作者Richard Harrison

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 15:35:19