2012-03-20 4 views
1

リモートフレームワークでは、返すオブジェクトに関するメタデータを保持する必要があります。 私はオブジェクトそのものを制御できないので(IDisposableにすることはできません)、そのタイプもわかりません。私の唯一の仮定は、参照型であるということです。オブジェクトファイナライズまたはガベージコレクションのイベント

問題は生涯で、いつ私のメタデータを無料にするのですか?

私は静的な辞書(ConcurrentDictionary)を作成し、そのオブジェクトにWeakReferenceとメタデータを保持するつもりです。質問は、どのようにしてメタデータを削除するかを知っていますか? オブジェクト自体がファイナライズされたときに通知を受け取る方法はありますか?

また、私は

は、特定のオブジェクトを収集するときは、信号を得ることはありませんあなた

+0

[C#:オブジェクト間の強力な参照を作成し、他を参照せずに複製する](http://stackoverflow.com/questions/7899501/c-create-strong-reference-between-objects-without-one-他を参照する) – dtb

答えて

3

.NET4以降を使用している場合は、おそらくConditionalWeakTable<K,V>を使用できます。

これは、あなた自身(おそらく)が自分自身でメタデータを解放することを心配する必要がないことを意味します。オブジェクト自体がなくなると、テーブルから消えることになります。

ConditionalWeakTable<TKey, TValue>クラスは、コレクションに格納されたキー のオブジェクトの有効期間の経営の他 コレクションオブジェクトとは異なります。通常、オブジェクトが コレクションに格納されると、オブジェクトのライフタイムは削除されるまで続きます(オブジェクトへの追加参照は )。またはコレクションオブジェクト 自体が破棄されるまで有効です。ただし、ConditionalWeakTable<TKey, TValue>クラスでキー/値ペアをテーブルに追加しても、テーブルに格納されている の値から直接到達できる場合でも、キーが保持されることは保証されません(たとえば、テーブルにキーA Aを値V1で、第2のキーBを値P2とし、 をA)とする。代わりに、ConditionalWeakTable<TKey, TValue> は、テーブルの外にあるキーへの参照がほかにないとすぐに、キー/値エントリを自動的に削除します。

1

ありがとう死霊術(オブジェクト復活)を気にしないでください。

あなたの最良のオプションは、弱い参照してmeatadataを組み合わせて、定期的にコレクションをスキャンするために確かにあります。

0

一般的にはアドバイスされていませんが、オブジェクトがファイナライズされた時点で自分のファイナライザを作成することもできます。 ConditionalWeakTableの提案は、あなたが達成しようとしているものに向けられているように聞こえます。

関連する問題