Eu tenho um aplicativo publicado em c #. O problema aqui é que sempre que fecho o formulário principal, clicando no botão vermelho de saída, ele fecha o formulário, mas não fecha o aplicativo. Descobri isso quando tentei desligar o computador, esperançoso de que o aplicativo que fiz estava funcionando sem problemas e fui bombardeado por muitas janelas filho com as quais coloquei MessageBox
alertas.
Eu tentei, Application.Exit
mas ele ainda chama todas as janelas e alertas filhos e não sei como usar Environment.Exit
e qual número inteiro colocar nele.
A propósito, sempre que meus formulários chamam o evento formclosed
ou form closing
, eu fecho o aplicativo com uma this.Hide()
função; Isso afeta o comportamento do meu aplicativo agora?
Respostas:
Do MSDN:
Application.Exit
Environment.Exit
Este artigo, Application.Exit vs. Environment.Exit , aponta para uma boa dica:
Você pode determinar se
System.Windows.Forms.Application.Run
foi chamado verificando aSystem.Windows.Forms.Application.MessageLoop
propriedade Se verdadeiro, então Executar foi chamado e você pode assumir que um aplicativo WinForms está executando da seguinte maneira.Referência: Por que Application.Exit falharia ao funcionar?
fonte
Application.Exit()
falhava ao sair do aplicativo, masEnvironment.Exit(1)
funcionava como um encanto.Environment.Exit(0)
qualquer valor diferente de zero deve ser um código de erro específico do aplicativo que pode ser usado por um script para executar as ações apropriadas. (Este é o novo código e um aplicativo WinForms, por isso é improvável que importa neste caso, mas bom saber para ferramentas de linha de comando qualquer escrita.)Environment.Exit
também pode ser usado para aplicação de formulários.return
declaração posterior melhoraria muito essa abordagem. Pelo que entendi, o código continuaria a execução apósApplication.Exit()
até umareturn
declaração.Sei que esse não foi o problema que você teve, mas outro motivo para isso acontecer é que você tem um thread não em segundo plano aberto no seu aplicativo.
Quando
IsBackground
éfalse
que vai manter o seu programa aberto até as concluída fio, se você definirIsBackground
paratrue
o segmento não vai manter o programa aberto. Coisas comoBackgroundWoker
,ThreadPool
eTask
todos usam internamente um fio comIsBackground
conjunto paratrue
.fonte
Tudo o que você precisa é
System.Environment.Exit(1);
E ele usa o espaço para nome do sistema "using System", que quase sempre existe quando você inicia um projeto.
fonte
Gostaria de um dos seguintes:
para um winform ou
para um aplicativo de console (funciona também em winforms).
Obrigado!
fonte
Em suma, sim. O aplicativo inteiro será encerrado quando o formulário principal (o formulário iniciado
Application.Run
noMain
método) for fechado (não oculto).Se todo o seu aplicativo sempre deve terminar totalmente sempre que o formulário principal for fechado, remova o manipulador fechado desse formulário. Ao não cancelar esse evento e deixá-lo fechar quando o usuário o fechar, você obterá o comportamento desejado. Quanto a todos os outros formulários, se você não pretende mostrar a mesma instância do formulário novamente, basta deixá-los fechar, em vez de impedir o fechamento e a ocultação. Se você estiver exibindo-os novamente, é possível escondê-los.
Se você deseja que o usuário clique no "x" do formulário principal, mas mantenha outro formulário aberto e, com efeito, torne-se o "novo" formulário principal, é um pouco mais complicado. Nesse caso, você precisará apenas ocultar seu formulário principal em vez de fechá-lo, mas precisará adicionar algum tipo de mecanismo que realmente feche o formulário principal quando você realmente deseja que seu aplicativo termine. Se você estiver nessa situação, precisará adicionar mais detalhes à sua pergunta, descrevendo quais tipos de aplicativos devem ou não encerrar o programa.
fonte
Você faz:
no seu Main ()?
Eu achei uma maneira muito fácil de matar o aplicativo quando o formulário é fechado.
fonte
fonte
Nesse caso, a maneira mais adequada de sair do aplicativo para substituir o método onExit () no App.xaml.cs:
fonte