出错代码
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(); }