Domanda

Sono uno studente di CompSci e abbastanza nuovo in C#, e stavo realizzando un programma "Josephus Problem" per una classe e ho creato un pulsante Esci che chiama Application.Exit() per uscire in qualsiasi momento, ma se C# è ancora lavorando sulla pittura e viene premuto il pulsante, viene generata un'eccezione ObjectDisposedExeception per l'oggetto Graphics.C'è un modo per evitare questo?.Stavo pensando di provare{}catturare o modificare un valore booleano per interrompere il processo di pittura prima di uscire, ma voglio sapere se esiste un'altra soluzione.

È stato utile?

Soluzione

Non dovrebbe essere possibile che ciò accada.Se il pulsante viene creato nello stesso thread della finestra, condividono un message pump e il gestore Paint non può essere interrotto per gestire il pulsante di uscita.Il messaggio che indica che è stato fatto clic sul pulsante verrà accodato nella coda dei messaggi del thread finché non ritorna il gestore Paint.

In genere, dovresti rimandare la pittura al gestore Paint (o sovrascrivere OnPaint) e ovunque sia necessario aggiornare lo schermo, chiamare il metodo Invalidate del controllo.Ciò dice a Windows che un'area deve essere ridipinta e, una volta che tutti gli altri messaggi sono stati gestiti, genererà un file WM_PAINT messaggio che alla fine chiamerà OnPaint, che a sua volta attiverà l'evento Paint.

Se stai animando, usa a System.Windows.Forms.Timer per attivare ogni fotogramma, anziché utilizzare un thread. System.Threading.Timer i callback vengono eseguiti sul pool di thread, quindi si trovano sempre sul thread sbagliato per manipolare l'interfaccia utente.

Altri suggerimenti

Dovresti essere chiamato il metodo Close() del Form che contiene il pulsante per chiudere il form in modo ordinato.La chiusura del modulo principale farà sì che l'applicazione venga comunque chiusa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top