これは私の最初の質問へのフォローアップであり、私の調査結果を提示し、修正、アイデア、および洞察を求めたいと思います。私の調査結果 (またはむしろ解釈) は、MSDN .NET 3.5 のドキュメントを読み、.NET 3.5 コードをデバッグして、以前の質問に対する人々の回答から得られました。これが、私のようにアプリケーションの終了を検出する方法を知りたがっている誰かにとって価値のあるものになることを願っています。
イベント:
System.AppDomain.CurrentDomain.ProcessExit
: プロセスが終了したときに発生します。たとえば、デフォルトAppDomain
と他のすべてがアンロードされた後です [合計実行時間はわずか 3 秒に制限されています!]。WPF の場合は、System.Windows.Application.Exit
代わりに使用してください。Windows フォームの場合Application.Run(...)
、メイン メソッドの後にコードを実行します。System.AppDomain.CurrentDomain.DomainUnload
:ユニット テスト フレームワーク (TestDriven.NET を使用した MbUnit) でクラスを実行する場合AppDomain
など、既定以外のアンロード時に発生します。AppDomain
System.AppDomain.CurrentDomain.UnhandledException
: (デフォルトで処理される場合AppDomain
:) スレッドが開始されたスレッドに関係なく、任意のスレッドで未処理の例外に対して発生しますAppDomain
。つまり、これはすべての未処理の例外のキャッチオールとして使用できます。System.Windows.Application.Exit
: WPF アプリケーション (つまり、デフォルトAppDomain
) が正常に終了したときに発生します。System.Windows.Application.OnExit
それを利用するにはオーバーライドします。ファイナライザー (C# のデストラクタ): ガベージ コレクターがアンマネージ リソースを解放するときに実行されます。【総実行時間制限あり!
イベントの順序:
WPF アプリケーション: 正常な終了
System.Windows.Application.Exit
System.AppDomain.CurrentDomain.ProcessExit
- ファイナライザー
WPF アプリケーション: 未処理の例外
System.AppDomain.CurrentDomain.UnhandledException
TestDriven.NET 内で実行されている MbUnit: テストに合格 (正常終了)
System.AppDomain.CurrentDomain.DomainUnload
- ファイナライザー
TestDriven.NET 内で実行されている MbUnit: テストに失敗しました (未処理の例外は MbUnit によって処理されます)
AppDomain.CurrentDomain.DomainUnload
- ファイナライザー
質問:
- 私の解釈/調査結果は正しいですか?
- 私が省略した詳細を知っていますか?たとえば、ファイナライザーの合計実行時間は?
- 私が知っている他のイベント/アイデアを知っていますか?
- Windows フォーム、Web サービス、ASP.NET Web サイトなどの他のアプリケーションでは、どのようなイベントが発生し、どのような順序で発生しますか?