none
Cerrar form creado en ejecución RRS feed

  • Pregunta

  • Buenos Días.

    Me surge una duda sobre si es necesario cerrar los formularios creados en tiempo de ejecución antes de cerrar el form que los contiene.

    Tengo un form con 10 variables de form y 10 paneles. El usuario puede necesitar abrir uno solo, varios o todos. Cada formulario se abre dentro de un panel. Ejemplo de uno

    Private FormSalud As Form

    If checkbox1.cheked = true then

         FormSalud = new FormProSalud

          ......

         PanelSalud.Controls.add(FormSalud)

    end if

    Mi pregunta es la siguiente: Si cierro el formulario contenedor de los paneles ¿Debo primero cerrar estos forms o se destruyen solos? Es a efectos del consumo en el PC.

    Gracias.

    lunes, 11 de mayo de 2020 4:29

Respuestas

  • Antes de cerrar el contenedor, debes llamar al método .Dispose() de los forms que ya no necesites. Esto les permite liberar los recursos no-gestionados que estén usando.

    Desde luego, antes de eso deberías haber hecho un .Close, pero esto es independiente. El Close solo oculta el form para que no se vea en pantalla, pero no libera ningún dato; el formulario cerrado sigue conteniendo todas sus variables, y de hecho esta es una forma muy usual de usar un formulario: se abre, se deja que el usuario introduzca datos, y después de cerrarlo se recuperan esos datos accediendo a las variables del formulario.

    Ni el Close ni el Dispose destruyen los forms en cuestión. Solo libera los recursos no-gestionados, pero los recursos gestionados siguen ocupando memoria. Quedan a disposición del Garbage Collector, que los libera más adelante, cuando exista presión de memoria. Es decir, a efectos de "consumo", como decías, se sigue consumiendo la memoria. Pero eso no debe preocuparte. Cuando la memoria escasee, el GC liberará las partes que ya no estén en uso.

    • Marcado como respuesta Angelnovato lunes, 11 de mayo de 2020 5:38
    lunes, 11 de mayo de 2020 5:21

Todas las respuestas

  • Antes de cerrar el contenedor, debes llamar al método .Dispose() de los forms que ya no necesites. Esto les permite liberar los recursos no-gestionados que estén usando.

    Desde luego, antes de eso deberías haber hecho un .Close, pero esto es independiente. El Close solo oculta el form para que no se vea en pantalla, pero no libera ningún dato; el formulario cerrado sigue conteniendo todas sus variables, y de hecho esta es una forma muy usual de usar un formulario: se abre, se deja que el usuario introduzca datos, y después de cerrarlo se recuperan esos datos accediendo a las variables del formulario.

    Ni el Close ni el Dispose destruyen los forms en cuestión. Solo libera los recursos no-gestionados, pero los recursos gestionados siguen ocupando memoria. Quedan a disposición del Garbage Collector, que los libera más adelante, cuando exista presión de memoria. Es decir, a efectos de "consumo", como decías, se sigue consumiendo la memoria. Pero eso no debe preocuparte. Cuando la memoria escasee, el GC liberará las partes que ya no estén en uso.

    • Marcado como respuesta Angelnovato lunes, 11 de mayo de 2020 5:38
    lunes, 11 de mayo de 2020 5:21
  • Hola

     

     

    Gracias por levantar tu consulta en los foros de MSDN. Cerraremos el Hilo, por ende si tiene alguna otra consulta por favor genera otra consulta para que la comunidad de foros te pueda asesorar.

     

    Siempre es un placer atender tus consultas!

     

    Gracias por usar los foros de MSDN.

     

    Oscar Navarro

    martes, 12 de mayo de 2020 16:31
    Moderador