vb.net - net - AddHandler/RemoveHandler no desecha correctamente
removehandler vb net (2)
Si el objeto a se suscribe al evento object b, entonces el objeto b no se recogerá hasta que se recolecte el objeto a.
Una suscripción de evento cuenta como una referencia al objeto editor.
Y sí, esto también sucede en C #, no tengo nada que ver con el lenguaje.
Si AddHandler
método AddHandler
, si nunca uso RemoveHandler
, ¿dará lugar a fugas de memoria en algunas condiciones y situaciones? No estoy tan seguro de la verdad de esto.
¿Y hay otras causas para las pérdidas de memoria que están únicamente disponibles en VB en comparación con C #?
Bueno, por lo general, no ... pero existe la posibilidad.
Cuando te suscribes a un evento, básicamente le das un delegado (un puntero func si lo prefieres) a tu método para el editor del evento, que se aferra a él siempre y cuando no canceles la suscripción con el operador - =.
Así que tome, por ejemplo, el caso en el que genera un formulario secundario y el formulario se suscribe al evento Click Button en el formulario.
button1.Click += new EventHandler(Form_Click_Handler);
Ahora el objeto del botón se mantendrá en la referencia del formulario. Cuando el formulario se cierra / desecha / establece en nulo, ya no se necesitan la forma y el botón; la memoria es reclamada.
El problema ocurre cuando tienes una estructura u objeto global que tiene una vida más larga. Digamos que el objeto Aplicación mantiene una lista de abrir ventanas secundarias. Por lo tanto, cada vez que se crea un formulario secundario, el objeto de la aplicación se suscribe a un evento Form para que pueda mantener las pestañas en él. En este caso, incluso cuando el formulario se cierra / elimina, el objeto de la aplicación lo mantiene activo (un objeto que no sea basura contiene una referencia al formulario) y no permite recuperar su memoria. A medida que sigues creando y cerrando ventanas, tienes una pérdida con tu aplicación que acapara más y más memoria. Por lo tanto, debe darse de baja explícitamente para eliminar la referencia del formulario de la aplicación.
childForm.Event -= new EventHandler(Form_Handler)
Por lo tanto, se recomienda que tenga un bloque de cancelación de suscripción (- =) que complemente su rutina de suscripción (+ =) ... sin embargo, podría hacerlo sin los escenarios de stock.