問題タブ [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# - ファイナライザーが呼び出されない
クラスが破棄されているときに、いくつかの通信ポートを適切に閉じたい C# のクラスがあります。ただし、プログラムを終了するときにファイナライザーが呼び出されることはありません。何故ですか?私は何か間違ったことをしていますか?
すべての通信を通過して閉じる手動で破棄を呼び出しています。これも解雇されません。
私が使用しているファイナライザーは次のとおりです。
c# - ガベージコレクションとファイナライザー:より細かいポイント
SOに関する別の質問*とその後のコメントの議論に答える際に、私ははっきりしない点で壁にぶつかりました。
私が迷っているところはどこでも訂正してください...
ガベージコレクターは、オブジェクトを収集するときに、そのオブジェクトのファイナライザーを別のスレッドで呼び出します(ファイナライザーがDispose()
メソッドなどによって抑制されている場合を除く)。収集中、GCは、収集をトリガーしたスレッド(バックグラウンド収集は別として)を除くすべてのスレッドを一時停止します。
明確でないこと:
- ガベージコレクターは、ファイナライザーがそのオブジェクトで実行されるのを待ってから収集しますか?
- そうでない場合は、ファイナライザーの実行中にスレッドの一時停止を解除しますか?
- 待機した場合、ファイナライザーが中断されたスレッドの1つによって保持されているロックに遭遇した場合はどうなりますか?ファイナライザースレッドはデッドロックしますか?(私の答えでは、これは悪い設計であると主張しますが、これが発生する可能性があるケースを見ることができた可能性があります)
*元の質問へのリンク:
.NETGCファイナライザーから同期されたオブジェクトへのアクセス
winforms - InvalidComObjectException の原因: 「基礎となる RCW から分離された COM オブジェクトは使用できません。」
この特定の例外に言及しているさまざまな質問を見てきました(この質問には、私が訪れたそれらの多くがリストされています)。また、この投稿と同じ一般的な質問がありますが、文脈が異なるため、回答は役に立ちません。
コンテキスト
から派生したクラスがあり、AxWindowsMediaPlayer
というクラスによって所有されています。View
これは 内にありPanel
、 内にありWorkspace
ます。最近、この状況について質問しましたが、その質問は、この問題に対する私の回避策が大丈夫かどうかに向けられたものでした。その質問の背景は、ここで関連しています。
が破棄されると、呼び出されView
たメソッドSynchronize()
が残りのすべてのView
オブジェクトで呼び出されます。View
を含むに対して、をAxWindowsMediaPlayer
呼び出しますvideoPlayer.Error.clearErrorQueue()
。
問題
Dispose()
トップ レベル ( Workspace.Dispose()
) で呼び出したときに、別のオブジェクトView
が破棄さSynchronize()
れ、残りのView
オブジェクトで呼び出されると、View
そのクラスを含むAxWindowsMediaPlayer
クラスがその行で例外をスローし、次のvideoPlayer.Error.clearErrorQueue()
ように述べます。
InvalidComObjectException: 基になる RCW から分離された COM オブジェクトは使用できません。
が基礎となる RCW ( Runtime Callable WrapperAxWindowsMediaPlayer
)からどのように分離されているのか、私は戸惑っています。この例外と呼び出しの危険性について説明しているこの記事を読みました。このメソッドを明示的に呼び出しているわけではありません。andおよび(から派生) クラスのメソッドにブレークポイントを配置しましたが、例外が発生する前にそれらのいずれにもヒットしません。Marshal.ReleaseComObject()
Dispose
Panel
View
VideoPlayerControl
AxWindowsMediaPlayer
私の回避策はView
、メディア プレーヤーの が常に最初に破棄されるようにすることです。これが前回の質問の動機でした。しかし、これがどのように起こっているのかを理解したいので、これを修正する必要があるかどうかを確認できます. 親クラスで呼び出される前に、誰がAxWindowsMediaPlayer
RCW から分離させているのでしょうか?Dispose
私の推測では、AxWindowsMediaPlayer
ファイナライザーが GC によって呼び出されていると思いますが、何がそれを引き起こしているのかわかりません。Dispose
どういうわけか、より高いレベルで呼び出すMarshal.ReleaseComObject
と、床下で呼び出されるようになります。誰かが私を啓発できますか?
c# - C# デストラクタに XML ドキュメントが必要なのはなぜですか?
私は、C# コードのコメントと Xml ドキュメントを最小限に抑えるようにしています。代わりに、可能であればコードを自己文書化することを好みます。
しかし、パブリック クラスのデストラクタに Xml コメントを付けないと、C# コンパイラから警告が表示されます。どうしてこれなの?
ここで Xml コメントに入力する必要がある有用な情報はありますか。これは行っていません。デストラクタのコメントを自分で読む必要があるとは思いませんでした。コンパイラは熱心すぎるだけですか?
c# - デコンストラクタを使用するのは間違っていますか?
C# の一時的な場所にいくつかのファイルを書き込んでいます。それらは、pdf サムネイルとしてレンダリングされます。オブジェクトが破棄されたときに場所をクリーンアップしたいので、このインスタンスでデコンストラクターを使用しても問題ありませんか?
f# - F#デストラクタに相当
アンマネージライブラリをラップするC#クラスをF#に変換しています。次のデストラクタを書き直すという一見単純な問題に遭遇しました。
この時点で私が持っている簡略化されたF#コードは次のとおりです。
このF#コードを変更して同じ動作をさせるにはどうすればよいですか?F#デストラクタを検索しても、私が持っている本やWeb上で結果が見つかりませんでした。
ありがとうございました。
java - Java でファントム参照を使用した finalize メソッドのしくみ
こんにちは、ファントム参照について 1 つ疑問があります。私が理解しているのは、オブジェクトがガベージ コレクションに向かう直前に finalize メソッドが呼び出されることです。ただし、オブジェクトがガベージ コレクションの対象でない場合、finalize メソッドは実行されません。
この finalize メソッドが呼び出されるときのファントム参照について話します。
ファイナライズは常にファントム参照で呼び出されます。
私はこれについて非常に混乱しています。私を助けてください。
c# - C#:ファイナライザーで、アプリケーションがシャットダウンしているかどうかを確認するにはどうすればよいですか?
アプリケーションのシャットダウン中に常に失敗するように見えるファイナライザーがあります。これは、その時点で無効になっているネイティブリソースを保持しているためだと思います。デストラクタ/ファイナライザで、アプリケーションのシャットダウンが原因で呼び出されているかどうかを確認する方法はありますか?
ありがとう!
c# - 基本クラスのデストラクタ/破棄を使用していますか?
C# では、Documentationに記載されているように、この素敵な投稿の受け入れられた回答では、クラスは親クラスのデストラクタを継承しないと述べられています。
質問: 基本クラスのプライベート要素を確実に破棄したい場合、すべての子クラスに IDisposable を実装し、Dispose メソッドで base.Dispose() を呼び出す適切な方法はありますか?
そうしても問題ないように見えますが、すべての子クラスでの実装を必要としない方法をお勧めします。