【发布时间】:2011-04-14 00:35:09
【问题描述】:
我在 WndProc 覆盖中使用以下函数:
Public Function GetPortName() As String
Dim portNameData As String
Dim comPortNumber As String
Try
Dim portSearcher As New ManagementObjectSearcher("\root\CIMV2", "Select Name, PNPDeviceID from Win32_PnPEntity")
For Each port As System.Management.ManagementObject In portSearcher.Get()
If port("Name").ToString.ToUpper.Contains("(COM") Then
portNameData = port("Name").ToString
comPortNumber = port("Name").ToString.Substring(port("Name").ToString.IndexOf("(COM") + 4)
comPortNumber = comPortNumber.TrimEnd(")"c)
If port("PNPDeviceID").ToString.ToUpper.StartsWith("USB\VID_1234&PID_1234") Then
Return "COM" & comPortNumber
End If
End If
Next
Catch ex As Exception
End Try
Return ""
End Function
该功能工作正常,但我现在从一个表单在一个新应用程序中使用它。在 For 循环的每次迭代中(在 For Each port As System... 行上),我都会收到以下消息:
检测到DisconnectedContext
上下文 0x607fd8 已断开连接。不会使用代理来为 COM 组件上的请求提供服务。这可能会导致损坏或数据丢失。为避免此问题,请确保所有上下文/单元都保持活动状态,直到应用程序完全使用 RuntimeCallableWrapper 完成,这些 RuntimeCallableWrapper 代表生活在其中的 COM 组件。
我认为这是某种线程问题。如何从表单中调用此函数以不发生此错误?
我找到了a post on MSDN outlining a very similar problem problem。那家伙说:
对不起,不要浪费你的时间。该代码在简单的控制台应用程序中运行时运行良好。当它在响应 DriveDetectorEvent 的 Windows 窗体中被调用时,就会出现问题。
我希望我能弄清楚 Forms 应用程序有什么不同。
编辑和可能的解决方案:根据DisconnectedContext MDA when calling WMI functions in single-threaded application 的答案,我认为这里的解决方案是在WndProc 之外调用GetPortName()。今晚我将对此进行测试并发布我的结果。
【问题讨论】:
标签: vb.net multithreading wmi