WMI获取USB设备信息报错 : 应用程序调用一个已为另一线程整理的接口。 (异常来自 HRESULT:0x8001010E (RPC_E_WRONG_THREAD))。


出错代码

 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();
                }

  

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM