2012-04-01 6 views
2

私はこのthreadを見ましたが、私の考えには答えられませんでした。私の理解のためのCriticalFinalizerObjectは誤解を使用していますか?

常にが発生するネイティブreourcesの再利用! GCは私がする必要がない理由

  • ので

  • 優雅なプログラム終了プログラムのUsing
  • クラッシュを使用して
  • disposeの呼び出し(第2ラウンドの後)に発生

    • CriticalFinalizerObjectから継承しますか?

      私はreourcesが再生されないのでしょうどのような状況が表示されない....

      私は何をしないのですか?

  • +1

    プログラムがクラッシュしたときにDispose()が実行されるとは思われません。 –

    +0

    @HenkHoltermanあなたが正しく編集されました。 (私の指摘は、ネイティブリソースは常に再利用されることです) –

    答えて

    2

    CriticalFinalizerObjectクラスは、Dispose/Finalizeプロセスに信頼性を追加します。防止のようなものThread.Abort()

    なぜ私はCriticalFinalizerObjectから継承する必要がありますか?

    Safehandle : CriticalFinalizerObjectを使用する主な理由は、管理されていないリソースパターンを処理しないようにするためです。 SafeHandleは、アンマネージリソースをマネージリソースに変換します。Joe Duffyを参照してください。

    私はアプリケーションプログラマとして、あなたがCriticalFinalizerObjectからクラスを派生させなければならないとは思わないが、 'ハンドル'を扱う必要があるときは、SafeHandleを使うべきだ。

    4

    私のポイントは、ネイティブリソースは、常に彼らはありません

    を再利用されるということです。クリティカルファイナライザは、カスタムホスティングシナリオで重要です。管理されていないミッションクリティカルなプログラムがCLRをホストしているが、マネージコードがクラッシュしたときにオペレーティングシステムが破棄されるように単純に終了できない種類。

    最も良い例はSQL Serverです。

    2

    すべてのことが支配しています。場合によっては、ネイティブリソースの再生以上のものが必要な場合もあります。ほとんどの場合、BCLのネイティブリソースコンシューマのすべてがCriticalFinalizerObjectを実装していません。たとえば、基本のファイルハンドルを閉じる前に、キャッシュされたデータをフラッシュするために、FileStreamはCriticalFinalizerObjectを実装します。

    関連する問題