Событие для завершения объекта или сборки мусора - PullRequest
1 голос
/ 20 марта 2012

Для инфраструктуры удаленного взаимодействия мне нужно сохранить некоторые метаданные об объекте, который я возвращаю. У меня нет никакого контроля над самими объектами (поэтому я не могу сделать их IDisposable), я также не знаю их тип. Мое единственное предположение, что это ссылочный тип.

Проблема в жизни, когда я освобождаю свои метаданные.

Я намереваюсь создать статический словарь (ConcurrentDictionary) и хранить там слабую ссылку на объект и метаданные. Вопрос в том, откуда мне знать, когда удалять метаданные? Есть ли способ получить уведомление, когда сам объект будет завершен?

Также меня не волнует некромантия (воскресение объекта)

Спасибо

Ответы [ 3 ]

3 голосов
/ 20 марта 2012

Если вы используете .NET4 или более позднюю версию, вы можете использовать ConditionalWeakTable<K,V>.

Это будет означать, что вам (вероятно) не придется беспокоиться о высвобождениисами метаданные: они просто исчезнут из таблицы после исчезновения самого объекта.

Класс ConditionalWeakTable<TKey, TValue> отличается от других объектов коллекции тем, что он управляет временем жизни ключей, хранящихся в коллекции.,Обычно, когда объект хранится в коллекции, его срок действия продолжается до тех пор, пока он не будет удален (и нет никаких дополнительных ссылок на объект) или пока сам объект коллекции не будет уничтожен.Однако в классе ConditionalWeakTable<TKey, TValue> добавление пары ключ / значение в таблицу не гарантирует, что ключ сохранится, даже если его можно получить напрямую из значения, хранящегося в таблице (например, если таблица содержит одинключ A со значением V1 и второй ключ B со значением P2, содержащим ссылку на A).Вместо этого ConditionalWeakTable<TKey, TValue> автоматически удаляет запись ключ / значение, как только за пределами таблицы не существует других ссылок на ключ.

1 голос
/ 20 марта 2012

Вы не получаете сигнал, когда конкретный объект собирается.

Ваш самый лучший вариант - это действительно комбинировать meatadata со слабой ссылкой и периодически сканировать коллекцию.

0 голосов
/ 20 марта 2012

Хотя обычно это не рекомендуется, вы также можете написать свой собственный финализатор, чтобы вы знали, когда объект завершен. Предложение ConditionalWeakTable звучит так, будто оно направлено на то, чего вы пытаетесь достичь.

...