2009-08-21 18 views
31

Sto cercando di capire quale dovrebbe essere utilizzato. Alla chiusura della mia app WinForm si attiva un modulo in modalità finestra di dialogo. Questo modulo esegue un worker in background che sincronizza il DB con il DB remoto e visualizza i suoi progressi su "Splash Form".Application.Exit() vs Application.ExitThread() vs Environment.Exit()

Ho un metodo in questo modo:

private void CloseMyApp() 
{ 
    SaveUserSettings(); 

    splashForm = new SplashForm(); 
    splashForm.ShowDialog(); 

    Application.ExitThread(); 
    //Application.Exit(); 
} 

che è quello che io chiamo di chiudere la mia app da Menu -> Esci e nel caso . Application.Exit() dà il seguente errore ->

Raccolta è stata modificata; l'operazione di enumerazione potrebbe non essere eseguita.

Ora ho letto che Environment.Exit() è brutale e significa che c'è probabilmente qualcosa che non va con la tua applicazione (vedi here).

Application.ExitThread() funziona ma sono certo che potrebbe essere solo APPEARTO funzionare e come non l'ho mai usato prima non sono sicuro quando è normalmente opportuno farlo.

risposta

24

Sfortunatamente, il problema non è causato da nessuno di questi e esiste davvero (anche se non si ottiene il messaggio) in tutti questi scenari.

Il tuo problema è questo:

Su chiudendo fuochi WinForm App di un modulo in modalità di dialogo. Questo modulo esegue un worker in background che sincronizza il DB con il DB remoto e visualizza i suoi progressi su "Splash Form".

Dal momento che non si sta effettivamente arrestando quando si richiede uno spegnimento, tutte le funzioni di "Esci" stanno cercando di abbattere il thread in background. Sfortunatamente, questo probabilmente sta accadendo nel mezzo della sincronizzazione del DB, e un'enumerazione che funziona nella logica di salvataggio probabilmente sta fornendo quell'errore.

Si consiglia di non utilizzare nessuno di questi - basta chiamare myMainForm.Close(). Questo dovrebbe chiudere la tua forma principale, che licenzierà la tua logica di chiusura in modo appropriato. Una volta che il modulo principale della tua applicazione si chiude, si spegnerà con grazia.

9

Environment.Exit() viene utilizzato per le app console.

che si desidera utilizzare: System.Windows.Forms.Application.Exit()

uscendo discussione, si sta solo uscendo contesto thread corrente, lasciando qualsiasi discussioni iniziate in primo piano in esecuzione. Sospetto che il thread che sta causando l'errore sia ancora in esecuzione, quindi hai essenzialmente mascherato il problema, non lavorato attorno ad esso. Vorrei provare a capire perché stai ricevendo questo errore "Collection was modified; enumeration operation may not execute." all'uscita. È esposto da Application.Exit(), ma non è causato da esso.

+1

Oppure, se è necessario eseguire un fail veloce dopo aver rilevato un errore in un gestore di errori di primo livello, dopo averlo registrato, se possibile, ovviamente. –

Problemi correlati