Como sair corretamente de um aplicativo c #?

Eu tenho um aplicativo publicado em c #. O problema aqui é sempre que eu fecho o formulário principal clicando no botão de saída vermelho, 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 eu fiz estava funcionando sem problemas, então fui bombardeado por muitas janelas secundárias com as quais coloquei MessageBox Alerts.

Eu tentei Application.Exit mas ele ainda chama todas as janelas filho e alertas e eu não sei como usar Environment.Exit e qual inteiro para colocar nele. A propósito, sempre que meus formulários chamam o evento formclosed ou form closing, fecho o aplicativo com uma function this.Hide() . Isso afeta como meu aplicativo está se comportando agora?

Do MSDN:

Aplicativo.Sair

Informa todas as bombas de mensagens que devem ser finalizadas e, em seguida, fecha todas as janelas do aplicativo após o processamento das mensagens. Esse é o código a ser usado se você tiver chamado Application.Run (aplicativos WinForms), esse método interrompe todos os loops de mensagens em execução em todos os threads e fecha todas as janelas do aplicativo.

Meio ambiente.

Encerra este processo e fornece ao sistema operacional subjacente o código de saída especificado. Esse é o código para chamar quando você estiver usando o aplicativo de console.

Este artigo, Application.Exit vs. Environment.Exit , aponta para uma boa dica:

Você pode determinar se System.Windows.Forms.Application.Run foi chamado, verificando a propriedade System.Windows.Forms.Application.MessageLoop . Se true, então Run foi chamado e você pode assumir que um aplicativo WinForms está sendo executado da seguinte maneira.

 if (System.Windows.Forms.Application.MessageLoop) { // WinForms app System.Windows.Forms.Application.Exit(); } else { // Console app System.Environment.Exit(1); } 

Referência: Por que o Application.Exit não funciona?

Eu sei que este não é o problema que você teve, no entanto, outra razão que isso pode acontecer é que você tem um segmento não em segundo plano aberto em seu aplicativo.

 using System; using System.Threading; using System.Windows.Forms; namespace Sandbox_Form { static class Program { private static Thread thread; [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); thread = new Thread(BusyWorkThread); thread.IsBackground = false; thread.Start(); Application.Run(new Form()); } public static void BusyWorkThread() { while (true) { Thread.Sleep(1000); } } } } 

Quando IsBackground for false ele manterá seu programa aberto até que o encadeamento seja concluído. Se você definir IsBackground como true o encadeamento não manterá o programa aberto. Coisas como BackgroundWoker , ThreadPool e Task usam internamente um thread com IsBackground definido como true .

Tudo que você precisa é System.Environment.Exit(1);

E ele usa o namespace do sistema “using System”, que está sempre presente quando você inicia um projeto.

A propósito. sempre que meus formulários chamam o evento formclosed ou form closing, fecho o applciation com uma function this.Hide (). Isso afeta como meu aplicativo está se comportando agora?

Em suma, sim. Toda a aplicação terminará quando o formulário principal (o formulário iniciado via Application.Run no método Main ) estiver fechado (não oculto).

Se todo o seu aplicativo deve sempre terminar completamente sempre que seu formulário principal estiver fechado, você deve simplesmente remover esse manipulador de formulário fechado. Ao não cancelar esse evento e apenas deixá-los fechar quando o usuário o fechar, você terá 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 ocultá-los. Se você os estiver mostrando novamente, escondê-los pode ficar bem.

Se você quiser que o usuário clique no “x” para o seu formulário principal, mas tenha outro formulário aberto e, com efeito, se torne o “novo” formulário principal, então é 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 realmente quiser que seu aplicativo termine. Se esta é a situação em que você está, você precisará adicionar mais detalhes à sua pergunta descrevendo quais tipos de aplicativos devem e não devem realmente terminar o programa.

Você faz:

 Application.Run(myForm); 

no seu Main ()?

Eu encontrei uma maneira muito fácil de matar o aplicativo quando o formulário é fechado.

Eu faria um dos seguintes:

Application.Exit ();

para uma winform ou

Environment.Exit (0);

para uma aplicação de consola (também funciona em winforms).

Obrigado!

 Environment.Exit(exitCode); //exit code 0 is a proper exit and 1 is an error 

Nesse caso, a maneira mais adequada de sair do aplicativo para replace o métodoExit () no App.xaml.cs:

 protected override void OnExit(ExitEventArgs e) { base.OnExit(e); }