問題タブ [finalizer]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
.net - .netファイナライザーは常に実行されますか?
ファイナライザーは、ある時点で.NETで実行されることが保証されていますか(予備の停電など)?私はGCがどのように機能するかを知っており、正確に実行されるときは非決定的であることを知っています。
(検索では良い答えが表示されなかったので、実際の答えを見つけるのはそれほど簡単ではないことを期待してこの質問を追加します。それとは別に、私はすでに答えを知っているので、追加します誰も言及しなかった場合に備えて、数日後にそれを行います。)
.net - SqlConnection は GC によって破棄されますか?
免責事項:IDisposable
管理されていないリソースを扱う場合は、 を実装する必要があることはわかっています。コードの残りの部分は決定論的であり、可能な限り迅速にクリーンアップすることを保証するusing (...) { }
(と同等) 必要があります。try {} finally { Dispose(); }
また、GC はを呼び出さないDispose()
ため、メソッドをオーバーライドしてFinalize()
(デストラクタ構文を使用して C# で) を呼び出すことをお勧めしますDispose()
。通常、GC は呼び出しますFinalize()
(GC.SuppressFinalize()
呼び出されていない場合)。
問題:using (SqlConnection...) { }
邪魔にならないようにしたので、コードが制御不能になったために実行できないという奇妙なシナリオがあります。私は通常決定論を行うことDispose()
ができますが、それを保証することはできません. Reflector を使用して逆アセンブルSqlConnection
し、Dispose() を使用していることを確認しましたが、盲目でない限り、ファイナライザー/デストラクタ (Finalize()
または~SqlConnection()
) はありません。それは、私ができない奇妙なケースでGCが接続を「クリーンアップ」(プールに送り返す)しないことを意味しますか? 決定的なものを見つけることができませんでした...
.net - Excel 相互運用機能を使用する場合の InvalidComObjectException
次のコードでアプリケーションを閉じると、InvalidComObjectException が発生します。
何故ですか?COM オブジェクトを破棄するためにファイナライザを使用すべきではありませんか?
c# - Dispose() またはファイナライザーを使用してマネージド スレッドをクリーンアップしますか?
次のような C++0x のメッセージ ポンプ クラスがあるとします (注、SynchronizedQueue は function<void()> のキューであり、キューで receive() を呼び出して空になると、呼び出し元のスレッドがブロックされるまで返品するアイテムがあります):
このクラスを C# に変換しましたが、デストラクタのコードについて質問があります。IDisposable パターンによると、マネージド リソースとアンマネージド リソースを解放するために Dispose() メソッドのみを提供する必要があります。
C++ デストラクタ コードを次の場所に配置する必要があります。
- アプリケーションの終了時にクライアントが呼び出す必要があるカスタム CleanUp() メソッドは? クライアントが忘れた場合はどうなりますか?
- クライアントも呼び出すことができるように、IDisposable の Dispose() メソッドはありますか? しかし、繰り返しますが、クライアントが忘れたらどうしますか?
- C#ファイナライザーメソッド内で常に実行されますか? 管理されていないリソースがない場合は、パフォーマンスが低下するため、ファイナライザー メソッドを含めないでください。
- どこにも?Thread オブジェクトは管理対象リソースであるため、done_ フラグのマークを無視して、GC に自然に処理させるだけですか? この方法でスレッドは強制的に中止されますか?
また、コンストラクター内で作成されたメッセージ ポンプ スレッドをバックグラウンド スレッドとしてマークしないと、MessagePump オブジェクトが GC されず、終了時にアプリケーションがハングすることもわかりました。これの理由は何ですか?
c# - C#でCOMイベントハンドラーを自動的に削除する
スタンドアロンの.exeCOMサーバーと、サーバーのインスタンスを起動してすぐに閉じる簡単なC#テストプログラムがあります。チャームのように機能します。ただし、C#プログラム自体を閉じると、ファイナライザーの実行中に例外が発生します。これは、実行されていないCOMサーバーからCOMイベントシンクの登録を解除/通知しないためです。
例外は
、「mscorlib.dllで発生したSystem.Runtime.InteropServices.InvalidComObjectExceptionタイプの最初の例外」です。
そして、コールスタック:
mscorlib.dll!System.Runtime.InteropServices.ComEventsSink.Unadvise()+ 0x20バイトmscorlib.dll!System.Runtime.InteropServices.ComEventsSink.RemoveAll(System.Runtime.InteropServices.ComEventsSinkシンク)+0x11バイト
mscorlib。 dll!System.Runtime.InteropServices.ComEventsInfo.Finalize()+0x18バイト
サーバーをシャットダウンする前にCOMイベントハンドラーを手動で削除することで、このエラーを修正できます。つまり、myComServer.OnFunkyEvent-= OnFunkyEventHandler; しかし、私はこれがエレガントでなく、エラーが発生しやすく、退屈だと感じています。したがって、問題は、COMイベントのRemoveAll()呼び出しを手動でトリガーして、ファイナライザーで実行されないようにすることはできますか?
java - ファイナライザーがオブジェクトを到達可能にするとどうなるでしょうか?
Java ではfinalize
、オブジェクトがガベージ コレクションされようとしているときに (それをオーバーライドする) オブジェクトで呼び出されます。しかし、ファイナライザーがオブジェクトを再び到達可能にしたらどうなるでしょうか?
c# - ファイナライザーと IDisposable
ドキュメント (MSDN: link ) に基づいて、ファイナライザーを実装するときに IDisposable パターンを使用する必要があることは明らかです。
しかし、(オブジェクトを破棄する決定論的な方法を提供するために) IDisposable を実装し、クリーンアップするアンマネージ リソースがない場合、ファイナライザーを実装する必要がありますか?
私が見たように、クラスにマネージド リソースしかなく、Dispose を呼び出さない場合、マネージド リソースは GC によって自動的にクリーンアップされるため、ファイナライザーを実装する必要はありません。私が間違っている?
また、Dispose メソッドを使用してイベント ハンドラーをクリーンアップするとどうなるでしょうか。Dispose は GC によって自動的に呼び出されないため、イベント ハンドラーが配線されないようにするためにファイナライザーを実装する必要がありますか?
.net - 別のAppDomainでキャッチされなかった例外がアプリケーションをシャットダウンするのを防ぐことはできますか?
ファイナライザーで例外をスローする不正なライブラリで問題が発生しました。もちろん、アプリケーションがクラッシュします。
これを回避するために、ライブラリを独自のAppDomainにロードしようとしましたが、例外が表面に表示され、アプリケーションがクラッシュします。
MSDNに記載されているように、に登録しAppDomain.UnhandledException
ても例外が発生するのを防ぐことはできませんが、「サブAppDomain」でそのような例外をキャッチする方法が他にないことに非常に驚いています。
プラグインホスト、またはAppDomainsを使用して潜在的に有害なコードをサンドボックス化するアプリケーションは、未処理の例外を停止するためにどのように機能しますか?それは実際に可能ですか?
注:私はすでに別の回避策を持っています。これはここで説明されています。不正なファイナライザーは、シャットダウン中にのみ収集されるように見える長期間のオブジェクト上にあるため、この「偽の」エラーをユーザーから隠すだけで十分です。それでも、この回避策は脆弱であることがわかります。これは、他の実際のエラーを隠すか、オブジェクトが以前に収集された場合にアプリケーションを爆破するリスクがあるためです。
c# - ファイナライザーでAppDomain.Unloadがスローされますか?
これまでの話ですが、AppDomain を使用して何らかのタスクを実行するこのワーカーがあります。ドメインのセットアップと破棄には費用がかかります。したがって、スレッドごとに WeakReference オブジェクトのキャッシュをワーカーに次のように作成します。
私が抱えている問題は、GC が収集するときに AppDomain.Unload の呼び出しで常に例外をスローするように見えることです。
だから私はそれが奇妙だと思っています、私はそのドメインで何も「実行」していないことを知っています...どうしたのですか?少し掘り下げて試行錯誤した結果、次のようになりました。
だから私の質問は:
- AppDomain.Unload はファイナライザーから常に失敗しますか? なんで?
- 上記の回避策で「望ましくない」ことはありますか?
c# - C# でファイナライザーを使用する良いサンプル
C# でのメモリ管理に関する記事をいくつか読んだとき、ファイナライザーのメソッドに戸惑いました。
それらに関連する非常に多くの複雑なルールがあります。たとえば、ファイナライザーがいつ呼び出されるかは誰にもわかりません。ctor のコードがスローされたとしても呼び出されます。CLR は、プログラムがシャットダウンしたときにすべてのファイナライザーが呼び出されることを保証しません。
実生活で使用できるファイナライザーは何ですか?
私が見つけた唯一の例は、GC の開始時にビープ音を鳴らすプログラムでした。
コードでファイナライザーを使用していますか? 良いサンプルがいくつかありますか?
更新:
ファイナライザーは、開発者が IDisposable を介して一部のクラスを常に正しく破棄するようにしたい場合に使用できます。(リンク;スティーブ・タウンゼントに感謝)