2016-08-09 17 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

は、現在の実行後mHandlerが現時点でGCを介して収集することができるように、それがOnLoadit方法にスコープされたクラスメンバー(例えば、プライベートフィールド)にmHandlerをchaning試し。

+0

3ミリ秒ごとに機能を実行するためのタイマーの代わりに実行すると安全ですか? – PaulWill

+0

.NETのタイマーの解像度があなたのニーズに合っていない場合は、可能な限りマネージコードを長く扱いますしかし、注意しなければならないのは、クリーンアップに対処する必要があることです。つまり、IDisposableを実装すると、オブジェクト全体がスコープから外れると、作成されたタイマーが取り除かれます。そうでなければ、同じエラーが発生します。 – DAXaholic

関連する問題