Cómo evitar la excepción ObjectDisposedException en C# cuando se cierra el dibujo y la aplicación

StackOverflow https://stackoverflow.com/questions/90662

  •  01-07-2019
  •  | 
  •  

Pregunta

Soy un estudiante de CompSci y bastante nuevo en C#, estaba haciendo un programa de "Problema de Josephus" para una clase y creé un botón Salir que llama a Application.Exit() para salir en cualquier momento, pero si C# todavía está Al trabajar en la pintura y se presiona el botón, se genera una excepción ObjectDisposedExeception para el objeto Graphics.¿Hay alguna forma de prevenir esto?.Estaba pensando en intentar{}captar o cambiar un valor booleano para indicarle al proceso de pintura que se detenga antes de salir, pero quiero saber si hay otra solución.

¿Fue útil?

Solución

No debería ser posible que esto suceda.Si el botón se crea en el mismo hilo que la ventana, comparten un mensaje y el controlador de Paint no se puede interrumpir para manejar el botón de salida.El mensaje de que se hizo clic en el botón se pondrá en cola en la cola de mensajes del hilo hasta que regrese el controlador Paint.

Generalmente, debe diferir la pintura al controlador Paint (o anular OnPaint) y en cualquier otro lugar donde necesite actualizar la pantalla, llame al método Invalidate del control.Eso le dice a Windows que es necesario volver a pintar un área y, una vez que se hayan solucionado todos los demás mensajes, generará un WM_PAINT mensaje que finalmente llamará a OnPaint, que a su vez activará el evento Paint.

Si animas, usa un System.Windows.Forms.Timer para activar cada fotograma, en lugar de utilizar un hilo. System.Threading.Timer las devoluciones de llamada se ejecutan en el grupo de subprocesos, por lo que siempre están en el subproceso incorrecto para manipular la interfaz de usuario.

Otros consejos

Se le debe llamar el método Close() del formulario que contiene el botón para poder cerrar el formulario de manera ordenada.Cerrar el formulario principal hará que la aplicación se cierre de todos modos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top