2010-07-16 20 views
7

Necesito una forma de seguir instancias de varias clases, sin que esas clases tengan conocimiento de que están siendo rastreados. Básicamente, tengo una fábrica de clases que crea instancias y las transfiere a otro hilo. Una vez que el hilo completa y descarga la instancia, necesito que me notifiquen para que pueda hacer referencia al conteo y a la salida de la fábrica de mi clase cuando todas las instancias hayan desaparecido.Recibir notificación de eliminación/destrucción de objetos

El desafío es que no puedo modificar ninguna de las clases que voy a cargar, porque no controlo su código fuente.

El seguimiento de las instancias que creo es simple, solo puedo ponerlas en algún tipo de colección cuando las creo. Rastrear su destrucción me está causando problemas. Si pudiera modificar el código fuente, agregaría un evento a cada clase y cuando creara una instancia, me engancharía al evento y lo usaría como mi notificación. Pero no puedo hacer eso.

Por lo tanto, la pregunta es esta: ¿hay una forma furtiva de monitorear una instancia de objeto y detectar cuándo se destruye?

Respuesta

3

No hay forma de obtener una notificación activa, pero puede guardar un WeakReference en los objetos y verificar periódicamente si alguno ha muerto.

Edit: ¡Me gusta la respuesta de Reed mejor que la mía!

+0

+1 Eso es gracioso - Estaba pensando lo mismo, hasta que leí la parte donde dijo que estaba controlando la construcción de los objetos;) –

+0

Esto realmente parece que podría ser la solución más viable en mi situación, ' Voy a intentar esto. –

+0

Me gusta el suyo mejor que Reed porque significa que los clientes de esos tipos no necesitan saber acerca de un tipo de decorador especial –

0

¿Qué hay de controlar la destrucción del objeto:

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? 
} 
+0

Así lo llama Destroy()? Recuerde que no puedo controlar los tipos que estoy cargando (de hecho, se cargan dinámicamente desde una carpeta y no sé de antemano qué encontraré allí). –

10

Dado que va a crear los objetos, parece que se podría devolver un Decorator en lugar de la instancia real.

Al usar Decorator Pattern, puede "ajustar" el objeto devuelto en su propia API decorada. La decoración podría proporcionar una implementación IDisposable que proporcionó su notificación de destrucción.

+0

Esto es bueno. Puede usar la reflexión para generar el decorador. Esto sería importante si la clase es masiva. – ChaosPandion

+0

Eso es muy interesante, voy a seguir esto. Gracias. –

2

Si mantiene una lista de las referencias a las instancias que crean no conseguirán basura recogida y así nunca será destruida ...

su lugar se puede crear un depósito que contiene una lista de GUID y crear un nuevo Guid para cada instancia y luego agregarlo a una lista en su lugar, algo así como un FactoryRepository. De esta forma, no tiene un problema de referencia para la recolección de basura, ya que las Guías son estructuras en lugar de tipos de referencia. A continuación, puede heredar de cada clase para crear un tipo que pueda notificar en destroy. Asumo que como no puede alterar el código de las clases originales, tampoco puede alterar a los consumidores de estas clases, por lo tanto, algo como el patrón del decorador (a través de una interfaz) está fuera porque los tipos no serían compatibles.

ejemplo muy simplificado:

public class OriginalClassDestroyNotifier : OriginalClass 
{ 
    private readonly Guid _instanceId; 

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

    ~OriginalClassDestroyNotifier() 
    { 
     FactoryRepository.NotifyDestroyed(_instanceId); 
    } 
} 
Cuestiones relacionadas