Tengo un montón de métodos que toman el WPF WriteableBitmap
y leen de su BackBuffer
directamente, usando un código inseguro.¿Se requiere GC.KeepAlive aquí, o puedo confiar en los locales y en los argumentos para mantener vivo un objeto?
No está del todo claro si debo utilizar GC.KeepAlive
cada vez que hago algo como esto:
int MyMethod(WriteableBitmap bmp)
{
return DoUnsafeWork(bmp.BackBuffer);
}
Por un lado, sigue existiendo una referencia a bmp
en la pila MyMethod
's. Por otro lado, parece depender de los detalles de implementación; esto podría compilarse a una llamada final, por ejemplo, sin guardar referencia en bmp
en el momento en que se ingresa el DoUnsafeWork
.
Del mismo modo, imaginemos el siguiente código hipotética:
int MyMethod()
{
WriteableBitmap bmp1 = getABitmap();
var ptr = bmp.BackBuffer;
WriteableBitmap bmp2 = getABitmap();
return DoUnsafeWork(ptr, bmp2);
}
En teoría, una referencia a bmp1
permanece en la pila hasta que se devuelve el método, pero una vez más, parece que el uso de un detalle de implementación. Seguramente el compilador es libre de combinar bmp1
y bmp2
porque nunca están vivos al mismo tiempo, e incluso si el compilador nunca hace eso seguramente el JITter todavía puede, y probablemente lo hace (por ejemplo, al almacenarlos a ambos en el mismo registro, primero uno, luego el otro).
Entonces, en general, ¿debo confiar en que los locales/argumentos son referencias válidas para un objeto, o debería usar siempre GC.KeepAlive
para garantizar la corrección?
Esto es especialmente desconcertante ya que, al parecer, FxCop thinks GC.KeepAlive is always bad.
Lectura relacionada: [? ¿Cuándo necesito usar 'GC.KeepAlive'] (http://blogs.msdn.com/b/oldnewthing/archive/2010/08/13/ 10049634.aspx) y [¿Cuándo se vuelve un objeto disponible para la recolección de basura?] (Http://blogs.msdn.com/b/oldnewthing/archive/2010/08/10/10048149.aspx) del blog de Raymond Chen. –
@DanielPryden Excelente enlace; Busqué en Google el primero pero no el segundo antes de preguntar. Además de lo que ya he preguntado, explica que 'this' tampoco mantiene vivo el objeto actual. –