我在 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 为止。
我认为这是某种线程问题。如何从表单中调用此函数才能不发生此错误?
I found MSDN 上的一篇文章概述了一个非常相似的问题 http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/20f46b55-6ffe-4961-b301-636e062029b6/。那家伙说:
抱歉,别浪费时间了。当代码在简单的控制台应用程序中运行时,它可以正常工作。当在 Windows 窗体中调用它来响应 DriveDetectorEvent 时,就会出现问题。
我希望我能弄清楚 Forms 应用程序中有什么不同。
编辑和可能的解决方案:基于以下答案在单线程应用程序中调用 WMI 函数时 DisconnectedContext MDA https://stackoverflow.com/questions/3921661/disconnectedcontext-mda-when-calling-wmi-functions-in-single-threaded-application/5657777#5657777我认为这里的解决方案是调用GetPortName()
在 WndProc 之外。今晚我将对此进行测试并发布我的结果。
阅读答案后在单线程应用程序中调用 WMI 函数时 DisconnectedContext MDA https://stackoverflow.com/questions/3921661/disconnectedcontext-mda-when-calling-wmi-functions-in-single-threaded-application/5657777#5657777看来我的代码不起作用的原因是它是从 WndProc 调用的,阻塞了 WndProc。这会导致问题,因为编组需要泵送消息......但我已经阻止了。
就我的目的而言,只需扫描计时器即可。您可能必须寻找另一种解决方案,例如在另一个线程上异步调用它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)