[英]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.