C# 进入和退出匿名方法的静态IntPtr访问
一个(全局)静态IntPtr变量被传递给一个p/invoke DLL互操作调用,该调用以常规代码将一个有效的USB设备句柄放入该变量中C# 进入和退出匿名方法的静态IntPtr访问,c#,static,out,C#,Static,Out,一个(全局)静态IntPtr变量被传递给一个p/invoke DLL互操作调用,该调用以常规代码将一个有效的USB设备句柄放入该变量中 private static IntPtr commHandle=(IntPtr)0 当USB设备挂起或处于奇怪状态时,对互操作代码的调用会无休止地等待应答。为了避免应用程序挂起,我将代码放入普通方法内部的匿名方法线程(如下所示)中,尽管打开端口的调用可以工作,但使用返回的句柄会导致错误——与当初没有打开端口时会出现的错误相同 public IntPtr Ope
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();
现在我们等待线程打开端口的一小段时间。如果线程在短暂的nap后仍在运行,我们知道端口打开失败,可以相应地处理。。。
只是,返回的句柄虽然看起来有效,但似乎并没有真正指向打开的端口 假设此编译,第二个if
中的res
看起来与从dllcomopen
中得到的res
不同:第一个if
的块是本地的。顺便说一句:将64位指针转换为32位整数不是一个好主意。是的,我对Stackoverflow编辑器有问题,忽略var res-手头的突出问题是为什么静态变量在放入匿名方法的怀抱时处于一种不完全存在的状态。