観察可能なものがどのくらいの頻度で変化するかを数えるオブジェクトのシナリオを考えてみましょう。オブジェクトへの参照には 2 つのタイプがあります。(1) カウントに関心のあるエンティティによるもの。(2) カウントに実際には関心がないが、カウントを更新する必要がある観察可能なものによって使用されるもの。カウントに関心のあるエンティティは、カウントを管理するオブジェクトへの参照を保持するオブジェクトへの参照を保持する必要があります。カウントを更新する必要があるが、実際には関心がないエンティティは、2 番目のオブジェクトへの参照を保持する必要があります。
最初のオブジェクトがファイナライザーを保持している場合、オブジェクトがスコープ外に出たときにファイナライザーが起動されます。これにより、2 番目のオブジェクトが登録解除される可能性がありますが、直接登録解除するべきではありません。サブスクリプションを解除するには、おそらくロックを取得する必要があり、ファイナライザーはロックを待機するべきではありません。代わりに、最初のオブジェクトのファイナライザーは、おそらく Interlocked.CompareExchange を使用して維持されるリンク リストにそのオブジェクトを追加し、他のスレッドが定期的にそのリストをポーリングして、サブスクリプション解除が必要なオブジェクトを探す必要があります。
注: 最初のオブジェクトが 2 番目のオブジェクトへの参照を保持している場合、最初のオブジェクトのファイナライザーが実行されたときに後者が存在することが保証されますが、特定の状態にあることは保証されません。クリーンアップ スレッドは、サブスクライブ解除以外に何もしようとしないでください。