use*_*338 2 c# windows exception
我有这段代码:
var searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_DiskDrive");
foreach (var queryObj in searcher.Get().Cast<ManagementObject>()) //Error points to this line
Run Code Online (Sandbox Code Playgroud)
基本上这段代码的作用是,它遍历连接的设备列表,并查看我想要的设备是否已连接。如果我在运行代码时设备已经连接的情况下运行此代码,则它可以完美运行。但是,如果我用 DBT_DEVICEARRIVAL 触发此代码(这是系统在连接某些设备时发送的事件,我用
private static IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if(..DBT_DEVICEARRIVAL..)
new ScanDevices(); /*Here lies the code from above (in the class)*/
}
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
由于应用程序正在调度输入同步调用,因此无法进行传出调用。(来自 HRESULT 的异常:0x8001010D (RPC_E_CANTCALLOUT_ININPUTSYNCCALL))。
如果我把 thread.sleep(5000) 放在上面的代码之上,所以它在执行前等待 5 秒,那么代码就可以工作了。所以冲突一定在某个地方,其他东西首先尝试访问该设备并为自己占据所有。
我在互联网上搜索并找到了一些建议,例如向自己发送自定义 postmessage 以触发代码,但我不知道如何做到这一点,甚至不知道如何解决问题。
这里最好的解决方案是什么?
将您的代码包装在一个新线程中:
Thread thread = new Thread(() =>
{
ManagementObjectSearcher theSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive");
foreach (ManagementObject currentObject in theSearcher.Get())
{
Debug.WriteLine("Device present: " + currentObject);
ManagementObject theSerialNumberObjectQuery = new ManagementObject("Win32_PhysicalMedia.Tag='" + currentObject["DeviceID"] + "'");
serial = theSerialNumberObjectQuery["SerialNumber"].ToString();
}
});
thread.Start();
thread.Join(); //wait for the thread to finish
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3546 次 |
| 最近记录: |