16

デバッグを終了するとき (停止ボタンを押すか、Shift + F5 を押すなど)、ファイナライザーを実装するクラスまたはクラスが破棄されると想定していましたIDisposable

を実装するクラスがいくつかありますIDisposable。アプリケーションがデバッガーから (または本番環境でのクラッシュから) 終了するときに (試して) 実行したいことがいくつかあります。現在、Dispose()呼び出されていないようであり、ファイナライザーでもありません~MyClass(){}

これを行う方法はありますか?

4

2 に答える 2

2

Windows サービスを通常どおり停止するには、コードを Stop メソッドに配置する必要があります。

http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicebase.stop.aspx

一般に、失礼なスレッドの中止と失礼なアプリ ドメインのアンロードでは、「通常の」ファイナライザーは実行されません。詳細については、この MSDN の記事を参照してください。

https://web-beta.archive.org/web/20150423173148/https://msdn.microsoft.com/en-us/magazine/cc163716.aspx

ここまでは、ランタイムがスレッドで ThreadAbortException をスローした結果としてのスレッド アボートについて簡単に説明してきました。通常、これによりスレッドが終了します。ただし、スレッドはスレッドのアボートを処理して、スレッドが終了しないようにすることができます。これを説明するために、ランタイムはより強力なアクション、適切な名前の失礼なスレッドの中止を提供します。無礼なスレッドの中止により、スレッドは実行を停止します。これが発生した場合、CLR はスレッド上のバックアウト コードが実行されることを保証しません (コードが CER で実行されている場合を除く)。失礼ですね。

同様に、典型的なアプリケーション ドメインのアンロードはドメイン内のすべてのスレッドを正常に中止しますが、無作法なアプリケーション ドメインのアンロードはドメイン内のすべてのスレッドを無作法に中止し、そのドメイン内のオブジェクトに関連付けられた通常のファイナライザーが実行されることを保証しません。SQL Server 2005 は、エスカレーション ポリシーの一部として、無作法なスレッド アボートと無作法なアプリケーション ドメインのアンロードを利用する CLR ホストの 1 つです。非同期例外が発生すると、リソース割り当ての失敗はスレッドの中止にアップグレードされます。また、スレッド アボートが発生したときに、SQL Server によって設定された期間内に終了しない場合、無作法なスレッド アボートにアップグレードされます。同様に、アプリケーション ドメインのアンロード操作が SQL Server によって設定された期間内に終了しない場合、それは失礼なアプリケーション ドメインのアンロードにアップグレードされます。

于 2012-07-13T23:02:43.260 に答える
1

CLR は、オブジェクトがいつ収集または破棄されるかについては約束しません。

ガベージ コレクターを明示的に呼び出してみることもできますが、それは推奨される方法ではないと思います。

最善の方法は、IDisposableオブジェクトをusingブロック内で使用することです。
それらがいつ処分されるかが保証されているのは、そのときだけです。

于 2012-07-13T21:19:10.783 に答える