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