出错代码
using (var managementClass = new ManagementClass("Win32_DiskDrive"))
{
var devices = managementClass.GetInstances();
foreach (var o in devices)
{
try
{
var mo = (ManagementObject) o;
var device = mo["Caption"].ToString();
disks += mo["Caption"] + ";";
}
catch (Exception e)
{
_log.WriteLog(LogType.Error, $@"GetDisk:{e}");
}
}
}
以上代码会抛出异常“GetDisk:System.InvalidCastException: 无法将类型为“System.__ComObject”的 COM 对象强制转换为接口类型“System.Management.IWbemServices”。此操作失败的原因是对 IID 为“{9556DC99-828C-11CF-A37E-00AA003240C7}”的接口的 COM 组件调用 QueryInterface 因以下错误而失败: 应用程序调用一个已为另一线程整理的接口。 (异常来自 HRESULT:0x8001010E (RPC_E_WRONG_THREAD))。”
解决方法:
将获取设备信息在新的线程中运行
using (var managementClass = new ManagementClass("Win32_DiskDrive"))
{
var t = new Thread(() =>
{
var devices = managementClass.GetInstances();
foreach (var o in devices)
{
try
{
var mo = (ManagementObject) o;
var device = mo["Caption"].ToString();
disks += mo["Caption"] + ";";
}
catch (Exception e)
{
_log.WriteLog(LogType.Error, $@"GetDisk:{e}");
}
}
});
t.Start();
t.Join();
}
WMI获取USB设备信息报错 : 应用程序调用一个已为另一线程整理的接口。 (异常来自 HRESULT:0x8001010E (RPC_E_WRONG_THREAD))。
原文:https://www.cnblogs.com/arvinlaw/p/12531414.html