Application.Exit () vs Application.ExitThread () vs Environment.Exit ()
-
19-09-2019 - |
Pergunta
Eu estou tentando descobrir o que eu deveria estar usando. No fechando os fogos de aplicativos WinForm de um formulário no modo de diálogo. Esse formulário é executado um trabalho de fundo que sincroniza o DB com o DB remoto e exibe-lo do progresso sobre o "Formulário Splash."
Eu tenho um método assim:
private void CloseMyApp()
{
SaveUserSettings();
splashForm = new SplashForm();
splashForm.ShowDialog();
Application.ExitThread();
//Application.Exit();
}
que é o que eu chamo para fechar meu aplicativo de Menu -> Sair e, no caso Form_FormClosing()
. Application.Exit()
dá o seguinte erro ->
coleção foi modificada; operação de enumeração não pode executar.
Agora eu li que Environment.Exit()
é brutal e meios provavelmente há algo errado com a sua aplicação (ver aqui ).
obras Application.ExitThread()
mas estou concered que ele só pode estar aparecendo para o trabalho e como eu nunca usei isso antes eu não tenho certeza quando é normalmente apropriado fazê-lo.
Solução
Infelizmente, o problema não é causado por qualquer um desses, e realmente existe (mesmo se você não receber a mensagem) em todos esses cenários.
Seu problema é o seguinte:
No fechando os incêndios WinForm App de um formulário no modo de diálogo. Esse formulário é executado um trabalho de fundo que sincroniza o DB com o DB remoto e exibe-lo do progresso sobre o "Formulário Splash."
Uma vez que você não está realmente desligar quando você solicitar um desligamento, todas as funções "Exit" estão tentando derrubar o seu segmento de segundo plano. Infelizmente, esta é provavelmente a acontecer no meio da sua sincronização DB, e uma enumeração que trabalham na economia de lógica provavelmente está fornecendo esse erro.
Eu recomendaria não usar qualquer um desses - apenas chamar myMainForm.Close()
vez. Isso deve fechar o formulário principal, que irá disparar a sua lógica de fechamento adequadamente. Uma vez que o formulário principal em suas fecha aplicação, ele vai desligar normalmente.
Outras dicas
Environment.Exit()
é usado para aplicações de console.
Você deseja usar: System.Windows.Forms.Application.Exit()
Ao sair da linha, você está apenas a sair do contexto do segmento atual, deixando quaisquer segmentos de primeiro plano começou a correr. Eu suspeito que o segmento que está causando o erro ainda está em execução, então você essencialmente mascarados o problema, não funcionou em torno dele. Gostaria de tentar descobrir por que você está recebendo este "Collection was modified; enumeration operation may not execute."
erro na saída. Ele está sendo exposto por Application.Exit()
, mas não é causada por ele.