Definitivamente tiene que limpiar la referencia. Si hubiera alguna duda, podría probar fácilmente con su propio evento estático como ese.
static class MemoryLeak
{
static List<Action<int>> list = new List<Action<int>>();
public static event Action<int> ActivateLeak
{
add
{
list.Add(value);
}
remove
{
list.Remove(value);
}
}
}
Luego, al establecer un punto de interrupción en la función de eliminación, puede ver que su referencia no está limpia.
class Program
{
static void Main(string[] args)
{
foo f = new foo();
MemoryLeak.ActivateLeak += o => f.bar();
f.tryCleanup();
}
}
class foo
{
public void bar()
{ }
public void tryCleanup()
{
MemoryLeak.ActivateLeak -= o => bar();
}
}
Como alternativa a la solución de Simon se puede utilizar un segundo cierre para crear una acción de "separar", que se puede pasar alrededor.
foo f = new foo();
Action<int> callfoo = o => f.bar();
MemoryLeak.ActivateLeak += callfoo;
Action cleanUp =() => MemoryLeak.ActivateLeak -= callfoo;
// Now you can pass around the cleanUp action and call it when you need to unsubscribe from the event.
cleanUp();
Me gusta el estilo succint aquí. Para mis necesidades, esto debería funcionar perfectamente. Gracias por tomarse el tiempo para escribir esto! – jschroedl