2011-10-18 17 views
6

Application.ThreadExceptionためreference pageApplication.ThreadException:デタッチしないとメモリリーク?

を言い、これは静的なイベントですので、あなたはあなたのイベントハンドラアプリケーションが配置されている、またはメモリリークが発生します を切り離す必要があります。

非常にページのサンプルコードがイベントハンドラを切り離さないにもかかわらず、イベントハンドラが切り離されていないと本当にリークしますか?

ハンドラをデタッチする必要があるのは、アプリケーションがシャットダウンする場合だけです。その場合、ハンドラがデタッチされているかどうかにかかわらず、アプリケーションによって使用されるすべてのメモリは、とにかく解放されますか?

+3

はい、イベントハンドラの登録を解除する前に、アプリが終了するまでのミリ秒はリークではありません。 –

答えて

4

それはおそらく非常に珍しいですが、WinFormsのアプリケーションのMain()方法はおそらく、何らかの理由で、次のようになります。

static bool AbortStartup { get; set; } 

[STAThread] 
public static void Main() 
{ 
    Application.Run(new CancelableSplashScreen()); 

    if (!AbortStartup) 
     Application.Run(new MainWindow()); 
} 

スプラッシュ画面が閉じると、メインウィンドウが表示されます、スプラッシュ画面がない限りAbortStatupプロパティをtrueに設定します。スプラッシュ画面からApplication.ThreadExceptionにイベントハンドラを追加した場合、CancelableSplashScreenのインスタンスは、アプリケーションが終了するまでガベージコレクションされません。これはかなり後になる可能性があります。

1

オブジェクトへの参照を(イベントハンドラであるインスタンスメソッドであると仮定して)行ってからyesにすると、リークが発生します。あなたはイベントから退会することができなくなります(インスタンスがなくなるため)。オブジェクトは、アプリケーションドメインが終了するまで(静的変数の存続期間であるため)存在します。

関連する問題