我使用的WndProc覆盖中的以下功能时检测:DisconnectedContext使用ManagementObjectSearcher
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组件上的请求。这可能会导致损坏或数据丢失。为避免此问题,请确保所有上下文/公寓都保持活动状态,直到应用程序完全使用表示其内部的COM组件的RuntimeCallableWrappers完成为止。
我认为这是某种线程问题。我怎样才能从表单中调用这个函数来避免这种错误发生?
我发现a post on MSDN outlining a very similar problem problem。这家伙说:
对不起,不要浪费你的时间。该代码在简单的控制台应用程序中运行时工作正常。这个问题出现在Windows响应DriveDetectorEvent的窗体中。
我希望我能弄清楚Forms应用程序有什么不同。
编辑和可能的解决方案:根据在DisconnectedContext MDA when calling WMI functions in single-threaded application答案我认为这里的解决方法是调用GetPortName()
以外的WndProc的。我会在今晚测试这个并发布我的结果。