web-dev-qa-db-ja.com

asp.net MVCコントローラーで明示的なDispose()メソッドが必要なのはなぜですか?誰かがその複雑さを説明できますか? (asp.net固有)

C#はガベージコレクターでリソースをかなりうまく管理できることを知っています。しかし、それがあるので、これは正確には何のためであり、なぜそれが必要なのでしょうか?

Asp.net mvcで.Dispose()が必要な理由を誰かが説明できますか?

また、接続を破棄するとはどういう意味ですか?なぜそれが必要なのですか? db.Dispose()のようにデータベース接続を破棄することが重要である理由の複雑さを知っている人はいますか?これはEF関連ですか、それともSQL Server関連ですか?その理由を正確に理解しようとしています。

protected override void Dispose(bool disposing)
{
   db.Dispose();
   base.Dispose(disposing);
}
29
Jan Carlo Viray

Disposeは、「管理されていない」リソース(ソケット、ファイルハンドル、ビットマップハンドルなど)を解放するためのものであり、ファイナライザの外部で呼び出されている場合(disposingフラグが意味するものです)、BTW )、もう役に立たないIDisposableオブジェクトを破棄するために、それを保持します。

「管理されていない」リソースはCLR(そのため、名前)によって管理されておらず、GCがそれらを台無しにしたり、すべてを解放したりすることはありません。 Disposeメソッド(および実際にそれを使用するコード!)がない場合は、オブジェクトのファイナライザに依存してクリーンアップします。最終的にファイナライザーが実行され(アプリが正常で、オブジェクトがhasファイナライザーの場合)、ファイナライザーがその仕事を行うと、すべて問題なく動作しますが...そうすることで、その間にハンドルが足りなくなったとしても、まあ。それらの他のスレッド/プロセス/それらを必要とするものにはあまりにも悪い。

ただし、Disposeを使用すると、リソースはすぐに解放され、状況が全体的に改善されます。

(ちなみに、これはEF、SQL Server、またはその他のテクノロジに限定されていません。Disposableパターンは.netフレームワーク全体にあり、もはや使用されなくなったIDisposableがある場合は常にそれを利用することをお勧めします。中古。)

IDisposableがケースバイケースで実装するのではなく、ツリーのこれまでに実装されている理由については... 100%確実ではありません。しかし、あなたがフレームワークを書いていると想像してください。すべてがIDisposableでない場合は、何かを取り除く必要があるたびに確認する必要があることを考慮してください。 -オブジェクトが使い捨てかどうか、そうである場合はDisposeです。ただし、代わりにIDisposableを "念のために"実装すると、事態は単純化され、常に破棄されます。 (オブジェクトにクリーンアップするものが何もない場合、Disposeはオーバーライドされません-その場合、その親のDisposeが呼び出され、必要なクリーンアップを実行します。何もしないでください...)そして、コントローラがクリーンアップするために必要なものを持っていることは十分にありふれたケースです。それが本当の理由でなくても、とにかくそうすることは非常に理にかなっています。

28
cHao