2016-08-09 160 views
2

我收到一个错误“回调是使用此代码对垃圾收集的代理类型进行的”,但我似乎找不到解决方案。回收垃圾回收问题

<DllImport("winmm.dll")> 
Private Shared Function timeSetEvent(delay As Integer, resolution As Integer, handler As TimerEventHandler, user As IntPtr, eventType As Integer) As Integer 
End Function 

<DllImport("winmm.dll")> 
Private Shared Function timeBeginPeriod(millisecond As Integer) As Integer 
End Function 

Private Sub OnLoadit() 
    timeBeginPeriod(1) 
    Dim mHandler As New TimerEventHandler(AddressOf TimerCallback) 
    Dim mTimerId As Integer = timeSetEvent(4, 0, mHandler, IntPtr.Zero, 1) 
End Sub 

Private Delegate Sub TimerEventHandler(id As Integer, msg As Integer, user As IntPtr, dw1 As Integer, dw2 As Integer) 
Private Sub TimerCallback(id As Integer, msg As Integer, user As IntPtr, dw1 As Integer, dw2 As Integer) 
    'my function code here 
End Sub 

回答

1

尝试chaning mHandler成一个类的成员(例如,私有字段),其目前它可以被限制在OnLoadit方法,以便其执行后mHandler可以通过GC的时刻收集。

+0

谢谢,如果这可以安全地运行,作为每3毫秒执行一个函数的定时器的替代方案? – PaulWill

+0

嗯,我会处理尽可能长的托管代码,但如果.NET的定时器的解决方案不符合您的需求,这确实会继续与它。然而有一点需要注意的是,你应该处理清理工作,即实现IDisposable,这样当你的整个对象超出范围时,它将摆脱创建的计时器,否则会发生相同的错误 – DAXaholic