1

私は次のようなsystemeventsを使用しています:

            SystemEvents.SessionEnding += SystemEventsSessionEnding;

ユーザーがシャットダウンまたはログオフしたことを検出しますが、メモリリークなどを防ぐためにこのイベントの登録を解除する必要があることを読みました。

いつ/どこでそれをすべきですか?

SystemEvents.EventsThreadShutdownでこれを実行できることを確認しました。このイベントは、システムイベントが発生する前に発生します。これが当てはまる場合は、システムイベントの登録を解除する必要がありますか?

または、メインフォームのFormClosingイベントでそれを行う必要がありますか?FormClosingイベントは常に発生しますか?

ありがとうございました!

4

2 に答える 2

3

プログラムの開始時に一度だけサブスクライブし、プロセスが終了するときにのみサブスクライブを解除しますか?もしそうなら、気にしないでください。

プロセスが終了したときに、周囲に「システムレベル」のフックがある場合は、それらをクリーンアップするのがオペレーティングシステムの義務です。心配する必要はありません。プロセスがもう存在しないにもかかわらず、オペレーティングシステムがオブジェクトのガベージコレクションを防止するわけではありません:)

于 2011-09-03T08:26:13.737 に答える
1

アプリケーションインスタンスの存続期間中にそのイベントが発生したときにアラートを受け取る必要がある場合は、いいえ、登録を解除する必要はありません。そのイベントをサブスクライブするスコープ外のオブジェクトがある場合、イベントオブジェクトはサブスクライバーへの参照を保持しているため、登録を解除して、GCされないようにする必要があります。

于 2011-09-03T08:27:41.357 に答える