問題タブ [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.

0 投票する
3 に答える
7104 参照

c# - ファイナライザーが呼び出されない

クラスが破棄されているときに、いくつかの通信ポートを適切に閉じたい C# のクラスがあります。ただし、プログラムを終了するときにファイナライザーが呼び出されることはありません。何故ですか?私は何か間違ったことをしていますか?

すべての通信を通過して閉じる手動で破棄を呼び出しています。これも解雇されません。

私が使用しているファイナライザーは次のとおりです。

0 投票する
3 に答える
8545 参照

c# - ガベージコレクションとファイナライザー:より細かいポイント

SOに関する別の質問*とその後のコメントの議論に答える際に、私ははっきりしない点で壁にぶつかりました。

私が迷っているところはどこでも訂正してください...

ガベージコレクターは、オブジェクトを収集するときに、そのオブジェクトのファイナライザーを別のスレッドで呼び出します(ファイナライザーがDispose()メソッドなどによって抑制されている場合を除く)。収集中、GCは、収集をトリガーしたスレッド(バックグラウンド収集は別として)を除くすべてのスレッドを一時停止します。

明確でないこと:

  1. ガベージコレクターは、ファイナライザーがそのオブジェクトで実行されるのを待ってから収集しますか?
  2. そうでない場合は、ファイナライザーの実行中にスレッドの一時停止を解除しますか?
  3. 待機した場合、ファイナライザーが中断されたスレッドの1つによって保持されているロックに遭遇した場合はどうなりますか?ファイナライザースレッドはデッドロックしますか?(私の答えでは、これは悪い設計であると主張しますが、これが発生する可能性があるケースを見ることができた可能性があります)

*元の質問へのリンク:
.NETGCファイナライザーから同期されたオブジェクトへのアクセス

0 投票する
1 に答える
2981 参照

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()DisposePanelViewVideoPlayerControlAxWindowsMediaPlayer

私の回避策はView、メディア プレーヤーの が常に最初に破棄されるようにすることです。これが前回の質問の動機でした。しかし、これがどのように起こっているのかを理解したいので、これを修正する必要があるかどうかを確認できます. 親クラスで呼び出される前に、誰がAxWindowsMediaPlayerRCW から分離させているのでしょうか?Dispose

私の推測では、AxWindowsMediaPlayerファイナライザーが GC によって呼び出されていると思いますが、何がそれを引き起こしているのかわかりません。Disposeどういうわけか、より高いレベルで呼び出すMarshal.ReleaseComObjectと、床下で呼び出されるようになります。誰かが私を啓発できますか?

0 投票する
4 に答える
516 参照

c# - C# デストラクタに XML ドキュメントが必要なのはなぜですか?

私は、C# コードのコメントと Xml ドキュメントを最小限に抑えるようにしています。代わりに、可能であればコードを自己文書化することを好みます。

しかし、パブリック クラスのデストラクタに Xml コメントを付けないと、C# コンパイラから警告が表示されます。どうしてこれなの?

ここで Xml コメントに入力する必要がある有用な情報はありますか。これは行っていません。デストラクタのコメントを自分で読む必要があるとは思いませんでした。コンパイラは熱心すぎるだけですか?

0 投票する
8 に答える
519 参照

c# - デコンストラクタを使用するのは間違っていますか?

C# の一時的な場所にいくつかのファイルを書き込んでいます。それらは、pdf サムネイルとしてレンダリングされます。オブジェクトが破棄されたときに場所をクリーンアップしたいので、このインスタンスでデコンストラクターを使用しても問題ありませんか?

0 投票する
2 に答える
2673 参照

f# - F#デストラクタに相当

アンマネージライブラリをラップするC#クラスをF#に変換しています。次のデストラクタを書き直すという一見単純な問題に遭遇しました。

この時点で私が持っている簡略化されたF#コードは次のとおりです。

このF#コードを変更して同じ動作をさせるにはどうすればよいですか?F#デストラクタを検索しても、私が持っている本やWeb上で結果が見つかりませんでした。

ありがとうございました。

0 投票する
3 に答える
822 参照

java - Java でファントム参照を使用した finalize メソッドのしくみ

こんにちは、ファントム参照について 1 つ疑問があります。私が理解しているのは、オブジェクトがガベージ コレクションに向かう直前に finalize メソッドが呼び出されることです。ただし、オブジェクトがガベージ コレクションの対象でない場合、finalize メソッドは実行されません。

この finalize メソッドが呼び出されるときのファントム参照について話します。

ファイナライズは常にファントム参照で呼び出されます。

私はこれについて非常に混乱しています。私を助けてください。

0 投票する
3 に答える
1505 参照

c# - C#:ファイナライザーで、アプリケーションがシャットダウンしているかどうかを確認するにはどうすればよいですか?

アプリケーションのシャットダウン中に常に失敗するように見えるファイナライザーがあります。これは、その時点で無効になっているネイティブリソースを保持しているためだと思います。デストラクタ/ファイナライザで、アプリケーションのシャットダウンが原因で呼び出されているかどうかを確認する方法はありますか?

ありがとう!

0 投票する
4 に答える
9604 参照

c# - 基本クラスのデストラクタ/破棄を使用していますか?

C# では、Documentationに記載されているように、この素​​敵な投稿の受け入れられた回答では、クラスは親クラスのデストラクタを継承しないと述べられています。

質問: 基本クラスのプライベート要素を確実に破棄したい場合、すべての子クラスに IDisposable を実装し、Dispose メソッドで base.Dispose() を呼び出す適切な方法はありますか?

そうしても問題ないように見えますが、すべての子クラスでの実装を必要としない方法をお勧めします。