SerialPort列表显示c#应用程序中的过时信息

SerialPort列表显示c#应用程序中的过时信息,c#,windows,serial-port,usbserial,C#,Windows,Serial Port,Usbserial,我有一个带有一些GUI的.net4c#应用程序。 它通过USB-UART转换器FT2232与串行网络设备一起工作。转换器实现了一个带有多个USB的集线器,这些USB在系统中显示为COMxx的编号 我支持动态端口添加/删除操作(通过WMI),以便端口在插入/拔出时在UI中自动刷新 插入式操作工作正常,即端口在插入后一两秒钟内可见。 但拔掉插头是个问题:拔掉插头后,并非所有的集线器端口都会消失,但四个端口中只有一个或两个端口会消失(此时所有端口都未使用,关闭)。此问题对WinXP x86和Win7

我有一个带有一些GUI的.net4c#应用程序。 它通过USB-UART转换器FT2232与串行网络设备一起工作。转换器实现了一个带有多个USB的集线器,这些USB在系统中显示为COMxx的编号

我支持动态端口添加/删除操作(通过WMI),以便端口在插入/拔出时在UI中自动刷新

插入式操作工作正常,即端口在插入后一两秒钟内可见。 但拔掉插头是个问题:拔掉插头后,并非所有的集线器端口都会消失,但四个端口中只有一个或两个端口会消失(此时所有端口都未使用,关闭)。此问题对WinXP x86和Win7 x64有效

一些调查显示,在一段时间后或通过计时器调用SerialPort.GetPortNames()刷新端口列表并没有帮助。这张单子已经过时了。 但是:如果我关闭带有端口的窗口(它不是主窗口)并再次打开它,一个虚拟端口将消失,然后所有虚拟端口都将消失

有没有人遇到过类似的情况或有什么想法

它可能与我从UI上下文调用GetPortNames有关吗


或者这是硬件驱动程序问题?

我想现在我解决了这个问题:

我发现在WMI设备添加/删除端口的事件处理程序中,信息不会刷新,奇怪的是,在plug/plug操作中有很多添加/删除事件激发

因此,如果我没有立即检查添加/删除的新端口,而是让它传递到我的视图模型的更高级别,那么端口信息将更新(在事件触发之间),并且我有一个连接的USB-UART设备的有效列表


总之,在某些情况下,究竟是什么原因导致端口在注册表中得到更新,而在其他情况下则不是。我查看了SerialPort的参考源。似乎没有进行任何类型的缓存,它只是从
HKEY\U LOCAL\U MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM
读取端口名。所以我希望如果你监视注册表项,你会看到类似的结果。端口是否也保留在设备管理器中?这是模拟串行端口的USB设备的常见问题。它们可以追溯到石器时代,不支持即插即用。所以没有合适的方法去发现港口已经不存在了。所以没有合适的方式更新屏幕。拔下插头之前,务必使用“安全删除硬件”托盘图标。是的,GetPortNames从注册表获取信息,这是相同的,即虚拟端口保持不变。但另一方面,它们在移除后立即从设备管理器中消失。因此,很明显,设备管理器和注册表中的信息要么来自不同的未同步源。另一个问题是设备管理器如何得到通知!?另一个有趣的注意事项是,如果我根本不运行我的应用程序,只需插入和拔出USB集线器端口,就会显示出来并从注册表中正确消失,不会有任何延迟。因此,不知何故,这个问题与应用程序资源有关,但我不知道。。。