Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 尝试访问USB设备时,RPC_E_CANTCALLOUT_ININPUTSYNCCALL_C#_Windows_Exception - Fatal编程技术网

C# 尝试访问USB设备时,RPC_E_CANTCALLOUT_ININPUTSYNCCALL

C# 尝试访问USB设备时,RPC_E_CANTCALLOUT_ININPUTSYNCCALL,c#,windows,exception,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 我得到这个错误: 无法进行传出呼叫,因为应用程序正在调度输入同步呼叫

我有一段代码:

var searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_DiskDrive");              
foreach (var queryObj in searcher.Get().Cast<ManagementObject>()) //Error points to this line
我得到这个错误:

无法进行传出呼叫,因为应用程序正在调度输入同步呼叫。(来自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

这是一个由线程引起的问题。你的问题根本没有提到关于你创建了什么类型的线程或者这是什么类型的应用程序(控制台vs gui)的任何细节。细节非常重要。我在那个应用程序中根本不使用线程。这是WPF应用程序。
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