2012-07-10 24 views
12

El código de prueba que usa WeakReference me falló al usar Mono 2.11.3 (SGen) y la versión estable 2.10.8. En un código simple como estecomportamiento WeakReference extraño en Mono

object obj = new object(); 
WeakReference wr = new WeakReference(obj); 

Assert.IsTrue(wr.IsAlive); 

obj = null; 
GC.Collect(); 

Assert.IsFalse(wr.IsAlive); 

la segunda afirmación fallará. Agregar GC.WaitForPendingFinalizers no ayuda. ¿Es esto un error en Mono o en mi cabeza? Gracias

+1

Si se trata de un error en su cabeza puede depurar remotamente adjuntando PsychicDbg, pero terminar la sesión puede ser fatal. – Polyfun

+4

Relevante: [GC.Collect \ (\) CLR <> Mono difference.] (Http://mono.1490590.n4nabble.com/GC-Collect-CLR-lt-gt-Mono-difference-td1536244.html) Perdí la comprensión sobre 2/3 del camino hacia abajo :) – AakashM

Respuesta

10

No es un error, sino un detalle de implementación en el que el Mono GC se comporta de forma diferente al MS GC. En este caso, dado que creó el objeto obj en el mismo marco de la pila, el código conservador de escaneo de la pila lo mantiene vivo. En código real (a diferencia de casos de prueba triviales como este) esto no es un problema. Si para su caso particular es, sugiero asignar el objeto y su WeakReference en un método separado:

static WeakReference Alloc() 
{ 
    return new WeakReference (new object()); 
} 
+0

que funcionó, gracias – actionresult

0
[MethodImpl((MethodImplOptions.NoInlining)] 
static WeakReference Alloc() 
{ 
    return new WeakReference (new object()); 
} 

debe asegurar Alloc() método no sea en línea cuando se compila

+1

Esta respuesta realmente no responde la pregunta de OP. Considere agregar algunas explicaciones a su respuesta. – Clijsters