如何解决使用ManagementObjectSearcher时检测到DisconnectedContext
| 我在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完全完成应用程序为止。
我认为这是某种线程问题。如何以不发生此错误的方式从表单调用此函数?
我在MSDN上找到了一篇帖子,概述了一个非常类似的问题。那家伙说:
抱歉,请不要浪费时间。在简单的控制台应用程序中运行时,代码可以正常工作。当它以Windows形式响应DriveDetectorEvent调用时出现了问题。
我希望我能弄清楚Forms应用程序中的不同之处。
编辑和可能的解决方案:基于在单线程应用程序中调用WMI函数时DisconnectedContext MDA的答案,我认为这里的解决方案是在WndProc之外调用ѭ2。我今晚将对此进行测试并将结果发布。
解决方法
在单线程应用程序中调用WMI函数时,在DisconnectedContext MDA上阅读了答案之后,似乎我的代码不起作用的原因是正在从WndProc调用它,从而阻止了WndProc。这会引起问题,因为封送处理需要发送消息...但是我已阻止。
就我的目的而言,只需扫描计时器即可。您可能必须找到其他解决方案,例如在另一个线程上异步调用它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。