2011-09-15 227 views
6

AddHandlerを使用した後に常にRemoveHandlerを呼び出す必要がある場合は、どこで行うのが最適ですか?vb.netでAddHandlerを使用する場合、RemoveHandlerを使用する必要がありますか?

私は以下のようないくつかの同様の質問を検索しましたが、私はあまり理解していません。

When and where to call the RemoveHandler in VB.NET?

AddHandler/RemoveHandler Not Disposing Correctly

私はC#またはvb.netでのガベージコレクションが使用されていないオブジェクトの世話をすると思いました。また、vb.netデザイナーでは、自動的にDispose Subを生成します。だから私は、プログラム的にリソースを解放することに全然気をつけなかった。メモリリークの問題はありますか?私が学習を始めるために私に親切にいくつかのリンク/文書を提供してください。

Protected Overrides Sub Dispose(ByVal disposing As Boolean) 
    Try 
     If disposing AndAlso components IsNot Nothing Then 
      components.Dispose() 
     End If 
    Finally 
     MyBase.Dispose(disposing) 
    End Try 
End Sub 

ありがとうございます!

+0

AddHandlerを使用しているコンテキストを投稿する必要があります。 – CommonSense

答えて

10

私はいつもそう

あなたは必ずこれを行う必要はありませんを行うには最高の場所であるのAddHandlerを、使用した後RemoveHandlerを呼び出す必要がある場合。

通常は、ソースオブジェクト(イベントのあるもの)がサブスクライバから失効する場合、RemoveHandlerを呼び出すだけで大丈夫です。フォーム内で作業している場合は、フォームの処理が中止され、ソースがイベントを発生させなくなり、両方のオブジェクトが範囲外になり、(最終的に)ガベージコレクションが行われるため、問題は発生しません。

この問題は、長期間保存されたオブジェクトのイベントにサブスクライブしている場合に発生します。他のオブジェクトからのものです。ガベージコレクタを使用している場合でも、メモリリークが発生する可能性があります。その場合、イベントのリッスンを完了したときにRemoveHandlerを呼び出すことをお勧めします。ただし、問題のイベントとアプリケーションのロジックに依存するため、これがいつ発生するかについての単一のガイダンスはありません。

関連する問題