簡體   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