¿Es seguro reemplazar todos los controladores de eventos estándar por WeakEventManager o su varian?
Controlador de eventos estándar (con operador+ =) es uno depérdida de memoria causa (si no está no registrada / eliminada (con- = operador)).
Y Microsoft lo resolvió conWeakEventManager y su herencia como:PropertyChangedEventManager, CollectionChangedEventManager, CurrentChangedEventManager, errorsChangedEventManager y así.
El código de ejemplo simple con pérdida de memoria es:
public class EventCaller
{
public static event EventHandler MyEvent;
public static void Call()
{
var handler = MyEvent;
if (handler != null)
{
handler(null, EventArgs.Empty);
Debug.WriteLine("=============");
}
}
}
public class A
{
string myText;
public A(string text)
{
myText = text;
EventCaller.MyEvent += OnCall;
// Use code below and comment out code above to avoid memory leakage.
// System.Windows.WeakEventManager<EventCaller, EventArgs>.AddHandler(null, "MyEvent", OnCall);
}
void OnCall(object sender, EventArgs e)
{
Debug.WriteLine(myText);
}
~A()
{
Debug.WriteLine(myText + " destructor");
}
}
void Main()
{
var a = new A("A");
var b = new A("B");
EventCaller.Call();
a = null;
GC.Collect();
EventCaller.Call();
}
El resultado es:
A
B
+++++++
A
B
+++++++
Podemos ver que no se llamará al destructor. Pero si cambiamos (al comentar el código no utilizado) de:
EventCaller.MyEvent += OnCall;
a
System.Windows.WeakEventManager<EventCaller, EventArgs>.AddHandler(null, "MyEvent", OnCall);
Y la salida es:
A
B
+++++++
B
+++++++
Un destructor
B destructor
Una vez que se anula a, su controlador de eventos ya no se llamará.
A y B se eliminarán después de que ya no se usen sin - = operador.
1. ¿Puedo reemplazar de forma segura a todos los operadores + = con System.Windows.WeakEventManager para evitar pérdidas de memoria debido a la falta de registro del evento y al guardar el código probablemente no debería implementar IDisposable?
2. Si no es realmente seguro, ¿qué debo considerar o notar?