几秒钟后TimeSetEvent失败(NullReferenceException)

时间:2015-09-06 20:32:38

标签: c# timer callback nullreferenceexception

我正在使用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 ...代码不会失败。

1 个答案:

答案 0 :(得分:0)

经过几天与我的同事一起审查越来越多的代码,我们发现了问题。不得不说这个问题没有足够的信息来解决它,但我们无法知道。这是一个非常复杂的程序,我们无法想象我们需要其他类的代码。

上面的代码位于Class B。这是从Class A调用的。结果Class A偶尔被销毁,而TimeSetEvent pinvoked(非托管)继续工作。因此,当它尝试查找回调函数时,它已与Class B中的所有内容一起处理,并且它提供空引用异常

解决方案是在Class B中实现方法,在删除Class A之前杀死计时器。然后,删除Class A将是安全的,而Class B将不会使应用程序崩溃。