問題タブ [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.
c# - ファイナライザーと破棄
BackgroundWorker
スレッドが常に実行されているという名前のクラスがあります。このスレッドをオフにするには、 to という名前のインスタンス変数がstop
である必要がありますtrue
。
クラスの使用が終了したときにスレッドが確実に解放されるようにするために、IDisposable
を呼び出すファイナライザーを追加しましたDispose()
。それが実際にこのスレッドを終了させると仮定するとstop = true
、このシペットは正しいですか? ファイナライザーから呼び出しDispose
てもいいですよね?
継承するDispose
場合、ファイナライザーは常に呼び出す必要がありますよね?object
IDisposable
c# - コンストラクターが例外をスローした場合、デストラクタは呼び出されますか?
C# および C++ の回答を探しています。(C# では、「デストラクタ」を「ファイナライザ」に置き換えます)
ruby - Ruby の RAII (または、Ruby でリソースを管理する方法)
オブジェクトが破壊されたときに何が起こるかを制御できないのは設計上のものであることはわかっています。また、一部のクラス メソッドをファイナライザーとして定義することも認識しています。
しかし、C++ の RAII (リソースはコンストラクタで初期化され、デストラクタで閉じられる) の Ruby イディオムですか? エラーや例外が発生した場合でも、オブジェクト内で使用されるリソースをどのように管理しますか?
確実に動作するようにする:
ただし、クラスのユーザーは、open メソッドを呼び出す必要があるたびに、 begin-rescue-ensure チャチャ全体を実行することを覚えておく必要があります。
たとえば、次のクラスがあります。
例外が他のクラスによって引き起こされ、スクリプトが終了した場合、resource_handle は閉じられません。
それとも、私がまだこれをC++のようにやっているという問題ですか?
.net - ファイナライザースレッドの範囲は何ですか?アプリケーションドメインごとまたはプロセスごとですか?
私のすべての読みに基づいて、すべてのファイナライザーを呼び出すための1つのGCスレッドが必要です。ここで問題となるのは、この「1つの」スレッドの範囲です。プロセスごとまたはアプリケーションドメインごとです。ドメインの全体的な目的は、1つのプロセススペースで「独立した」異なるアプリケーションを分離して作成することです。
私はここを読んだ:
ファイナライザーで未処理の例外が発生した場合、CLRの実行スレッドは例外を飲み込み、ファイナライザーを正常に完了したかのように扱い、侵害可能なキューから削除して次のエントリに移動します。
ただし、もっと深刻なのは、ファイナライザーが何らかの理由で終了しない場合、たとえば、ファイナライザーがブロックされ、決して発生しない状態を待機している場合にどうなるかです。この場合、ファイナライザスレッドがハングするため、ファイナライズ可能なオブジェクトがガベージコレクションされることはありません。この状況を十分に認識し、ファイナライザーで管理されていないリソースを解放するための最も単純なコードの記述に固執する必要があります。
もう1つの考慮事項は、アプリケーションのシャットダウン中に何が起こるかです。プログラムがシャットダウンすると、ガベージコレクターは、ファイナライズ可能なすべてのオブジェクトのファイナライザーを呼び出そうとしますが、特定の制限があります。
ファイナライズ可能なオブジェクトは、シャットダウン中に上位のヒープ世代にプロモートされません。
個々のファイナライザーの実行時間は最大2秒です。それより長くかかる場合、それは殺されます。
すべてのファイナライザーが実行されるまでに最大40秒かかります。ファイナライザーがまだ実行中の場合、またはこの時点で保留中の場合、プロセス全体が突然強制終了されます。
「アプリケーション」、「プロセス」、「アプリケーションドメイン」という用語の誤用が多すぎる投稿(および公式ドキュメント)-通常、アプリケーションは単一のプロセスで単一のアプリケーションドメインで実行されるため、それらのほとんどは同等であると想定しています。 。この誤用により、これらのドキュメントはすべて読みにくくなり、役に立たなくなります。
したがって、私の質問では、複数のアプリケーションが、それぞれが単一のプロセスの個別のアプリケーションドメインで実行されることを前提としています。
これらのアプリケーションはすべて同じGCスレッドとファイナライザースレッドを共有していますか?上記の記事で説明されている問題(ファイナライザースレッドのハング)は、そのプロセスのすべてのアプリケーションに影響しますか?はいの場合-ファイナライザースレッドを検出してThread.Abortを送信するなどの回避策(悪いアプリケーションを使用しないこと以外)はありますか?
上記のすべては、私が同様の問題にぶつかったためです。私のアプリケーションは、サードパーティソフトウェア(Outlook)へのアドインとして別のアプリケーションドメインで実行されます。さまざまな理由により、COM参照を完全に解放するためにGC.CollectとGC.WaitForPendingFinalizersを呼び出す必要があります(通常の相互運用ルーチンはOffice / Outlookには不十分です)。特定の他のサードパーティのアドインが実行されていると、GC.WaitForPendingFinalizersが永久にハングします。 、そのため、そのサードパーティに「悪い」ファイナライザーが追加されているのではないかと思います。私はその追加(クライアントの要件)を置き換える/削除することを制御できないので、それらを共存させる方法を自分で理解する必要があります。
c# - 静的ファイナライザ
いくつかの静的ファイナライズを実行する正しい方法は何ですか?
静的デストラクタはありません。イベントはAppDomain.DomainUnload
デフォルト ドメインでは発生しません。イベントは、すべてのAppDomain.ProcessExit
イベント ハンドラー間で合計 3 秒 (既定の設定) の時間を共有するため、実際には使用できません。
.net - GC Finalizer スレッドを識別する方法は?
.NET (C#) マルチスレッド アプリケーションを使用しており、ファイナライザー スレッド内で特定のメソッドが実行されているかどうかを知りたいです。
Thread.CurrentThread.Name を使用してみましたが、動作しません (null を返します)。
現在のスレッドにクエリを実行して、それがファイナライザー スレッドであるかどうかを確認する方法を知っている人はいますか?
python - Python:ファイナライザーを介してプログラムを終了する前にバッファーをフラッシュする
透かしまたはオブジェクトのファイナライズのイベントで(永続ストレージに)フラッシュするトランザクションのキャッシュを保持します。__del__
すべてのオブジェクトで呼び出されることが保証されなくなったので、同様の関数(または__del__
それ自体)をatexit.register
(初期化中に)フックする適切なアプローチはありますか?
私が間違っていなければ、これにより、メソッドがバインドされているオブジェクトがプログラムが終了するまでぶらぶらします。これは問題になる可能性は低いですが、もっとエレガントな解決策があるのではないでしょうか。
注:キャッチできない例外が発生する可能性がある__del__
ため、使用が理想的ではないことはわかっていますが、プログラム全体でカスケード呼び出しを行わないで、これを行う別の方法を考えることはできません。TIA!finalize()
c# - ソケットの破棄/2回のファイナライズの問題?
私は、ソケットを開き、リクエストを作成し、応答をリッスンするクラスのいくつかのコード(急いで追加するのではなく、まったく信頼していません)で作業しています。これは、可能な方法で例外をスローしていますxunitでテストしたときに理解できません。同じ例外が「ライブ」で発生すると想定していますが、クラスはシングルトンによって参照されているため、おそらく非表示になっています。
この問題は、xunit で「System.CannotUnloadAppDomainException: アプリケーション ドメインのアンロード中にエラーが発生しました」として明らかになり、内部例外は、ソケットを閉じるときにファイナライザー内で (本質的に) スローされる「System.ObjectDisposedException」です! close を呼び出して破棄するソケットへの他の参照は Socket クラスで保護されていないため、オブジェクトを他にどのように破棄できるかはわかりません。
さらに、単に ObjectDisposedException をキャッチして吸収すると、リスナー スレッドを閉じる行にヒットしたときに xunit が終了します。
ソケットを閉じるように求められる前に、ソケットを破棄する方法がわかりません。
ソケットに関する私の知識は、この問題を見つけてから学んだことだけなので、SO が必要とするすべてのものを提供したかどうかはわかりません。そうでなければLMK!
c# - TcpClient を使用するクラスにファイナライザーを実装する必要がありますか?
オブジェクトを使用する(プライベートフィールドとして持つ)クラス(たとえばMyClass
)がありTcpClient
ます。メソッドでの呼び出しをMyClass
実装します。IDisposable
TcpClient.Close
Dispose
私の質問は、呼び出し元のコードによって呼び出されない場合に備えて、アンマネージ リソースを解放するMyClass
ために呼び出すファイナライザーも実装する必要がありますか?Dispose(bool Disposing)
TcpClient’s
MyClass.Dispose
ありがとう
c# - この非常に単純なシナリオで .net デストラクタが呼び出されないのはなぜですか?
私は次のコードを持っています:
Finalizer メソッドは GC.Collect の呼び出し時に呼び出されると思っていましたが、そうではありませんでした。
誰かが私に理由を説明できますか?