2011-04-14 63 views
3

我使用的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的。我会在今晚测试这个并发布我的结果。

回答

4

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

对于我的目的,简单地扫描一个计时器的作品。您可能需要找到另一个解决方案,例如在另一个线程上异步调用它。

相关问题