2

他のインスタンスのファイナライザーからファイナライザーなしでオブジェクトにアクセスしたい。

ファイナライザー呼び出しのシーケンスは非決定論的であるため、ファイナライザーから他のファイナライズ可能なオブジェクトにアクセスするのは悪い考えであることを私は知っています。

しかし、他のオブジェクトのファイナライザーからファイナライザーなしでインスタンスにアクセスする場合はどうでしょうか? 私はこれを理解できません。記事http://edn.embarcadero.com/article/29365でのみ見つかりました:

これは、ファイナライザーが他のファイナライズ可能なオブジェクトにアクセスしてはならないことを意味します (ただし、ファイナライザーのないオブジェクトは問題ありません)。

MSDNでこれの確認はありますか?

現在、タイプの変数でロックオブジェクトを取得したいのですが、アクセスする前にそれが問題なく、インスタンスがメモリから解放されていないobjectことを確認したいです。object

ありがとう

4

2 に答える 2

1

現在オブジェクト型の変数でロックオブジェクトを取得したい

ファイナライザーでそのオブジェクトにアクセスしても問題ありません。何も起こりませんでした。実際にロックステートメントを使用すると、それほどうまくいきません。ファイナライザ スレッドをブロックすると、ひどくバイトする傾向があります。プログラムの終了時にタイムアウトがあり、 2 秒以内に完了してすべてを確定する必要があります。そのタイムアウトのトリップを回避するために Monitor.TryEnter() を使用する余裕はありません。これは悪いリソースリークになります。

また、コードの臭いに注意してください。他のスレッドがまだアクセスできるときに、ファイナライザーを作成したネイティブ リソースを解放するべきではありません。誰もオブジェクトへの参照を保持していない場合にのみ、ファイナライザーを実行できるのは福音です。これは、スレッドが参照を持つことができなくなったため、ロックする意味がなくなったことも意味するはずです。誰も読み書きできない場合、共有状態をロックで保護する必要はありません。

ファイナライザーを実際に記述することは、ほとんどの場合間違っている傾向があることに注意してください。ネイティブ リソースは、対応する .NET ラッパー クラスによってファイナライズする必要があります。多くありますが、低レベルのものは SafeHandle 派生クラスです。

于 2013-06-20T12:44:04.420 に答える