0

(全局)静态 IntPtr 变量被传递给 ap/invoke DLL 互操作调用,该调用将常规代码中的 USB 设备的有效句柄放入该变量中。

private static IntPtr commHandle = (IntPtr)0;

当 USB 设备挂起或处于奇怪状态时,对互操作代码的调用将无休止地等待回复。为了避免应用程序挂起,我将代码放入普通方法内的匿名方法线程(如下),虽然打开端口的调用有效,但使用返回的句柄会导致错误——与您遇到的相同类型的错误获取如果端口没有首先打开。

public IntPtr OpenPort(int deviceID)
Thread weAreAnonymous = new Thread(() => 
{
    if( 0==(int)commHandle)
    {
        var res = dllCommOpen(deviceID, out commHandle);
    } 
    if ((int)res > 0)
    {
        dllComFlush(res);
        this.IsOpen = ((int)res != 0);
    }
});

weAreAnonymous.Start();

现在我们等待线程打开端口的时间很短。如果线程在短暂的小睡后仍在运行,我们知道端口打开失败并且可以相应地处理......只是,返回的句柄虽然看起来是有效的,但似乎并不真正指向一个打开的端口!

4

0 回答 0