【发布时间】:2015-12-02 09:08:15
【问题描述】:
我正在使用 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 的整数。我不明白这个 null 来自哪里,如果我评论 TimerId = TimeSetEvent... 代码不会失败。
【问题讨论】:
-
在哪一行代码中抛出异常?
-
它没有说,因此我找不到它。但是,我注释了所有代码并逐个添加函数,并意识到当我调用此 TimeSetEvent 时,它会在 20 次左右迭代后很快崩溃。即使该功能什么也不做。但是,不称其为“有效”(= 不会崩溃,但显然我需要那个计时器)。
-
timeSetEvent是做什么的? -
类似于 Timers.Timer 但更精确。它被称为 Timer 多媒体,在高达 1ms 的窗口中具有令人难以置信的高精度)。
-
如果您不向我们显示minimal reproducible example,我们将无法回答。我怀疑这个问题是由一个被 gc-ed 或移动的托管对象引起的。考虑将 TimerEventhandler 保留在范围内,并可能将其包装在
fixed语句中以防止它在内存中移动。 stackoverflow.com/questions/2490912/what-are-pinned-objects
标签: c# timer callback nullreferenceexception