我使用的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的。我會在今晚測試這個併發布我的結果。