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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top