10

シナリオ:

アプリケーションは、を実装するクラスの単一インスタンスをインスタンス化しますIDisposable。インスタンスは、アプリケーションのすべての部分にアクセスできるようにする静的メンバーを介して公開されます。単一のインスタンスは、アプリケーションの存続期間中存続する必要があります。

質問

Disposeアプリケーションがシャットダウンしてプロセスが終了する前にメソッドを呼び出すことはどれほど重要ですか?

Disposeこのようなほとんどのシナリオでは、プロセスの終了によってリソースが自然にクリーンアップされるため、呼び出す必要はないと常に信じていました。私が間違っている?

4

3 に答える 3

7

「アプリケーションがシャットダウンする」とは、プロセスが終了していることを意味する場合、技術的には何もする必要はありません。プロセスが終了し、OSがこれらのリソースを解放します。

一部のコンポーネントが特定の種類のファイルやその他のリソースを作成する可能性があり、Dispose呼び出されない場合は、プロセスが終了しても必ずしもクリーンアップされるとは限らない、あいまいなコーナーケースである可能性があります。

これは奇妙なコーナーケースですが、例を挙げたいと思います。コード内のコンポーネントを参照して使用するとします。これを作成して使用すると、マシン上に2GBのファイルが作成されます。次に、さらに一歩進んで、このコンポーネントが、バグまたは単に不適切な設計のために、使用中にこの2GBファイルにアクセスするファイルハンドル自体を実際に閉じているとしましょう。このオブジェクトのDisposeメソッドはこのファイルをクリーンアップしますが、十分に文書化されていません。基本的に、Disposeこれへの呼び出しを逃すと、マシンにファイルが残ります。これは間違いなくコーナーケースであり、マシンに「リーク」が発生することはありませんが、2GBのファイルがそこにあるだけです。

そうは言っても、ベストプラクティスはDispose、リソースを決定論的に使用したときに呼び出すことです。Cleanup()シングルトンで、シャットダウン時に実行できるメソッドを呼び出すことができます。

于 2012-09-26T04:49:24.907 に答える
1

この投稿には、イベントパブOthersの処分が良い習慣である理由についての詳細な説明があります

.NETオブジェクトイベントと破棄/GC

gcがPublisherを収集せず、nullに設定した後もイベントを発生させ続けるコーナーケースがあるため。

于 2012-09-26T04:20:14.090 に答える
0

Disposeメソッドが呼び出されていることを確認したい場合、およびそれが死または生きている状況でない場合は、にアタッチできますAppDomain.CurrentDomain.ProcessExit

リソースがクリーンアップされていることを絶対に確認する必要がある場合は、メインの実行可能ファイルを監視するシェル実行可能ファイルを使用し、その後クリーンアップします。

于 2012-10-04T09:46:09.407 に答える