将(全局)静态IntPtr var传递给p / invoke DLL interop调用,该调用将常规代码中的USB设备的有效句柄放入该var中。
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();
现在我们等待一小段时间让线程打开端口。如果线程在小睡后仍然在运行,我们知道端口打开失败并且可以相应地处理... 只是,看似有效的返回句柄似乎并没有真正指向开放端口!