Tengo un comportamiento muy extraño que solo parece suceder en un formulario.Cerrar un formulario desde el controlador de carga
Básicamente estoy creando una instancia de Form
, y llamando al Show()
para mostrar el formulario sin bloqueo. En el controlador de eventos Load
de ese formulario, tengo alguna lógica que puede llamar al this.Close()
bajo ciertas circunstancias. Esto cierra el formulario, pero luego el método Show()
en el código del cliente arroja un ObjectDisposedException
.
El seguimiento de la pila de la ObjectDisposedException es el siguiente:
en System.Windows.Forms.Control.CreateHandle()
en System.Windows.Forms.Form.CreateHandle()
en Sistema .Windows.Forms.Control.get_Handle()
en System.Windows.Forms.ContainerControl.FocusActiveControlInternal()
en System.Windows.Forms.Form.SetVisibleCore (valor booleano)
en System.Windows.Forms.Control .Mostrar()
... etc.
Esto es lo que estoy viendo esto suceda:
Control.Show()
se llama- se puso en marcha mi forma
- la
OnFormLoad
método se llama - el manejador
FormLoad
evento se llama, en el interior del cual llamothis.Close()
- el método
OnFormClosing
es ca llena - el manejador
FormClosing
evento se llama Dispose
se llama en mi formulario y controla todo lo que es el usuario
y luego en algún lugar hacia el final del método Control.Show()
, se trata de obtener un identificador para el formulario , que se asusta y arroja una excepción porque el objeto está marcado como desechado.
Mi verdadera pregunta es, ¿por qué puedo hacer exactamente lo mismo en cualquier otra forma que tenga sin excepciones? ¿Es un problema de GC? Intenté poner una llamada GC.Collect()
justo después del this.Close()
y no hace ninguna diferencia. Como dije, sucede el 100% del tiempo en este formulario, y nunca en ningún otro lado, independientemente de los controles de usuario secundarios, el alcance de la variable de formulario, etc.
¿Alguna idea?
Desafortunadamente, no utilizo Windows Dev, pero parece correcto. ¡Gracias! – LoveMeSomeCode
No funciona en .Net2.0 – Vadim