繁体   English   中英

几秒钟后,TimeSetEvent失败(NullReferenceException)

[英]TimeSetEvent failing after a few seconds (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);

即使延迟200毫秒,它也无法正常工作。

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的整数。如果我注释TimerId = TimeSetEvent ...,则我不知道该null出现在frmo的TimerId = TimeSetEvent 。代码不会失败。

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

上面的代码在Class B 这是从Class A调用Class A 事实证明, Class A偶尔会被破坏,并且当TimeSetEvent 故障(不受管理)时,它会继续工作。 因此,当它尝试查找回调函数时,它与Class B所有内容一起被放置了,并给出了null引用异常

解决方案是在Class B实现一个方法 ,该方法在删除Class A之前终止计时器。 然后,可以安全地删除Class A Class B不会使应用程序崩溃。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM