2011-04-14 60 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。這會導致問題,因爲封送處理需要抽取消息......但是我已經封鎖了。

對於我的目的,簡單地掃描一個計時器的作品。您可能需要找到另一個解決方案,例如在另一個線程上異步調用它。

相關問題