环境:Windows窗体应用程序,C#.NET 3.5,VS2008
当我从重写的WndProc处理程序中调用以下函数时,我在mc.GetInstances()行上得到此异常“COMExcepion未处理 - 应用程序调用了为不同线程编组的接口。(HRESULT异常: 0x8001010E(RPC_E_WRONG_THREAD))“
这个更加神秘的消息实际上显示在前面提到的异常之前:
“检测到DiconnectedContext - 上下文0x3333b40已断开连接。将不会使用任何代理来处理COM组件上的请求。这可能会导致损坏或数据丢失。为避免此问题,请确保所有上下文/公寓保持活动状态,直到应用程序完全由RuntimeCallableWrappers完成,它们代表了它们内部的COM组件。“
private bool IsRemovableDevice(char dl)
{
ManagementClass mc = new ManagementClass("Win32_LogicalDisk");
ManagementObjectCollection partitions = mc.GetInstances();
string bleh = "";
foreach (ManagementObject p in partitions)
{
if (Convert.ToString(p["Caption"])[0] == dl && (int)p["DriveType"] == 2)
return true;
}
return false;
}
这是交易,当从WndProc函数以外的任何上下文调用时,上面列出的函数工作正常。
我该如何解决这个问题?
答案 0 :(得分:0)
我不完全确定错误,但我在MSDN上发现了这个:
http://social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/bbe38513-977c-456f-ae81-9b8c2aa1feb1
不确定它是否对您有帮助。
我认为需要将这类内容放在WndProc
中,WMI有时会很昂贵。使用相对快速的计时器而不是UI消息泵可能会更好。
快速搜索WMI事件并检测可移动驱动器可以找到这些来源: