出錯代碼
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();
}
