Получите уведомление об объектном распоряжении/разрушении

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

Проблема состоит в том, что я не могу изменить ни один из классов, я буду загрузка bve, потому что я не управляю их исходным кодом.

Отслеживание экземпляров, которые я создаю, просто, я могу просто поместить их в своего рода набор, поскольку я создаю их. Отслеживание их разрушения вызывает меня проблемы. Если бы я мог бы изменить исходный код, я добавил бы событие к каждому классу и когда я создаю экземпляр, я сцепился бы в событие и использование что как мое уведомление. Но я не могу сделать этого.

Так, вопрос - это: существует ли подлый способ контролировать экземпляр объекта и обнаружить, когда он уничтожается?

8
задан Tim Long 16 July 2010 в 18:30
поделиться

4 ответа

Нет способа получать активные уведомления, но вы могли бы вести WeakReference на объекты и периодически проверять, не умер ли какой-нибудь из них.

Edit: Ответ Рида мне нравится больше, чем мой!

5
ответ дан 5 December 2019 в 08:50
поделиться

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

Используя шаблон декоратора , вы можете «обернуть» возвращенный объект в свой собственный оформленный API. Декорация может предоставить реализацию IDisposable, которая предоставит вам уведомление об уничтожении.

11
ответ дан 5 December 2019 в 08:50
поделиться

Как насчет того, чтобы вы контролировали разрушение объекта:

public void Destroy(T obj)
{
    if (obj == null)
        throw new ArgumentNullException("obj");
    if (!_living.Contains(obj))
        throw new ArgumentException("Where did this obj come from?");

    using (obj as IDisposable)
    {

    }

    _living.Remove(obj); // List?
}
1
ответ дан 5 December 2019 в 08:50
поделиться

Если у вас есть список ссылок на созданные вами экземпляры, они не будут собираться сборщиком мусора и никогда не будут уничтожены ...

Вместо этого вы можете создать репозиторий который содержит список Guid и создает новый Guid для каждого экземпляра, а затем добавляет его в список - что-то вроде FactoryRepository. Таким образом, у вас не возникает проблем со ссылками на сборку мусора, поскольку Guids - это структуры, а не ссылочные типы. Затем вы можете наследовать от каждого класса, чтобы создать тип, который может уведомлять об уничтожении. Я предполагаю, что, поскольку вы не можете изменить код исходных классов, вы также не можете изменить потребителей этих классов, поэтому что-то вроде шаблона декоратора (через интерфейс) отсутствует, потому что типы не будут совместимы.

Очень упрощенный пример:

public class OriginalClassDestroyNotifier : OriginalClass
{
    private readonly Guid _instanceId;

    public OriginalClassDestroyNotifier(Guid instanceId)
    {
        _instanceId = instanceId;
    }

    ~OriginalClassDestroyNotifier()
    {
        FactoryRepository.NotifyDestroyed(_instanceId);
    }
}
2
ответ дан 5 December 2019 в 08:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: