使用ManagementObjectSearcher时检测到DisconnectedContext

时间:2011-04-14 00:35:09

标签: vb.net multithreading wmi

我在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组件提供服务。这可能会导致损坏或数据丢失。为了避免这个问题,请确保所有上下文/公寓都保持活动状态,直到应用程序完全使用代表其中的COM组件的RuntimeCallableWrappers完成。

我认为这是某种线程问题。如何从表单中调用此函数,以便不会发生此错误?


我找到了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()。我今晚将测试这个并发布我的结果。

1 个答案:

答案 0 :(得分:4)

DisconnectedContext MDA when calling WMI functions in single-threaded application阅读答案之后,似乎我的代码不起作用的原因是它是从WndProc调用的,阻塞了WndProc。这会导致问题,因为封送需要抽取消息......但我已经阻止了。

就我的目的而言,只需在计时器上扫描即可。您可能必须找到另一个解决方案,例如在另一个线程上异步调用它。