我正在使用TimeSetEvent并且其回调函数正在运行,但是几秒钟之后,如果回调函数根本不起作用,它就会失败:
// Vars
private TimerEventHandler timerRef;
private uint timerId = 0;
//Later, where I use TimeSetEvent
timerRef = new TimerEventHandler(CallbackFunction);
timerId = timeSetEvent(200, 10, timerRef, UIntPtr.Zero, TIME_KILL_SYNCHRONOUS | TIME_PERIODIC);
即使延迟了200ms,它也无法正常工作。
private void CallbackFunction(uint id, uint msg, UIntPtr userCtx, UIntPtr uIntPtr, UIntPtr intPtr)
{
// Even if this is empty, it will fail
}
我得到NullReferenceException(大部分时间)或AccessViolationException(偶尔)。我怀疑两者都来自同一个问题。
有趣的是,我在另一个类中具有完全相同的结构并且它有效。我复制了那堂课,在这里......它没有。我收到了这个错误。
我不明白为什么它不起作用(而在其他课堂上)以及如何解决它。
PD:timerId返回一个不同于0的整数。我不知道这个null来自哪里,如果我评论TimerId = TimeSetEvent
...代码不会失败。
答案 0 :(得分:0)
经过几天与我的同事一起审查越来越多的代码,我们发现了问题。不得不说这个问题没有足够的信息来解决它,但我们无法知道。这是一个非常复杂的程序,我们无法想象我们需要其他类的代码。
上面的代码位于Class B
。这是从Class A
调用的。结果Class A
偶尔被销毁,而TimeSetEvent
被 pinvoked(非托管)继续工作。因此,当它尝试查找回调函数时,它已与Class B
中的所有内容一起处理,并且它提供空引用异常。
解决方案是在Class B
中实现方法,在删除Class A
之前杀死计时器。然后,删除Class A
将是安全的,而Class B
将不会使应用程序崩溃。