Domanda

Sto cercando di capire quale dovrei usare. Su chiudendo WinForm fuochi app di un modulo in modalità di dialogo. Quella forma gestisce un operaio di sfondo che si sincronizza il DB con il DB a distanza e lo visualizza è progressi sul "Splash forma".

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 Form_FormClosing(). Application.Exit() dà il seguente errore ->

  

Collezione è stata modificata; l'operazione di enumerazione non può eseguire.

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

opere Application.ExitThread() ma sono concered che possa essere presente solo al lavoro e come non ho mai usato prima non sono sicuro quando è normalmente opportuno farlo.

È stato utile?

Soluzione

Purtroppo, il problema non è causato da uno di questi, ed esiste davvero (anche se non si ottiene il messaggio) in tutti questi scenari.

Il problema è questo:

  

Il chiudendo fuochi WinForm App di un modulo in modalità di dialogo. Quella forma gestisce un operaio di sfondo che si sincronizza il DB con il DB a distanza e lo visualizza è progressi sul "Splash forma".

Dal momento che non sta effettivamente spegnere quando si richiede un arresto, tutte le funzioni "Exit" stanno cercando di abbattere il tuo thread in background. Purtroppo, questo è probabilmente accadendo nel mezzo della vostra sincronizzazione DB e un'enumerazione di lavoro nella logica salvare probabilmente sta fornendo tale errore.

mi sento di raccomandare di non utilizzare uno qualsiasi di questi - basta chiamare myMainForm.Close() invece. Questo dovrebbe chiudere il modulo principale, che scatta la logica di chiusura in modo appropriato. Una volta che il modulo principale nella vostra applicazione si chiude, si spegnerà con grazia.

Altri suggerimenti

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

Si desidera utilizzare: System.Windows.Forms.Application.Exit()

Per uscire discussione, si è solo di uscire dal contesto thread corrente, lasciando qualsiasi discussioni iniziate in primo piano in esecuzione. Ho il sospetto il filo che causa l'errore è ancora in esecuzione, in modo da ho essenzialmente mascherato il problema, non ha lavorato intorno ad esso. Vorrei cercare di capire il motivo per cui hai trovato questo "Collection was modified; enumeration operation may not execute." errore in uscita. E 'di essere esposti per Application.Exit(), ma non è causato da esso.

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