Como sair corretamente de uma aplicação C#?

Tenho um pedido publicado em C#. O problema aqui é que sempre que eu fechar o formulário principal, clicando no botão de saída vermelho, ele fecha o formulário, mas não fecha a aplicação. Eu descobri isso quando tentei desligar o computador, esperançoso que a aplicação que eu fiz estava funcionando sem problemas, então eu fui bombardeado por um monte de janelas de crianças com as quais eu coloquei MessageBox alertas.

Tentei a candidatura.Sair, mas ele ainda chama todas as janelas de criança e alertas e não sei como usar o ambiente.Saída e que número inteiro para colocar nele. A propósito, sempre que os meus formulários chamam o evento formclosed ou de encerramento do formulário, fecho a aplicação com uma função this.Hide(). Isso afecta a forma como a minha candidatura se está a comportar agora?

Author: Tshepang, 2012-10-19

8 answers

De MSDN:

Aplicação.Sair

Informa todas as bombas de mensagens que devem terminar, e depois fecha todas as janelas de aplicações após as mensagens terem sido processadas. Este é o código a usar se você for chamado aplicação.Executar (aplicações WinForms), este método pára todos os loops de mensagens em execução em todos os tópicos e fecha todas as janelas da aplicação.

Ambiente.Sair

Termina isto. processo e dá ao sistema operacional subjacente o código de saída especificado. Este é o código a chamar quando você está usando a aplicação console.

Este artigo, aplicação.Saída vs. Ambiente.Saída , aponta para uma boa dica:

Pode determinar se System.Windows.Forms.Application.Run foi chamado verificando a propriedade System.Windows.Forms.Application.MessageLoop. Se for verdade, então Run foi chamado e você pode assumir que um aplicativo WinForms está executando como segue.

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

Referência: Por que razão Aplicacao.A saída não funciona?

 250
Author: Furqan Safdar, 2017-05-23 12:34:41

Eu sei que este não é o problema que você teve, no entanto, outra razão que isso poderia acontecer é que você tem um fio não de fundo aberto em sua aplicação.

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 é false ele vai manter o seu programa aberto até que o thread concluir, se você definir IsBackground para true, a linha não irá manter o programa aberto. Coisas como ... BackgroundWoker, ThreadPool, e Task Todos internamente usam um tópico com IsBackground definido em true.

 13
Author: Scott Chamberlain, 2013-10-08 21:18:18

Tudo o que precisas é System.Environment.Exit(1);

E ele usa o espaço de nomes do sistema "usando o sistema" que está quase sempre lá quando você inicia um projeto.

 10
Author: Omar Moodie, 2014-07-29 18:30:20
A propósito. sempre que meus formulários chamam o evento formclosed ou de fechamento do formulário eu fecho o applciation com um este.Esconder () a função. Isso afecta a forma como a minha candidatura se está a comportar agora?
Resumindo, sim. A aplicação completa terminará quando o formulário principal (o formulário iniciado via Application.Run no método Main for fechado (não escondido).

Se toda a sua aplicação deve terminar sempre completamente sempre que o seu formulário principal está fechado, então você deve apenas remover esse formulário tratador fechado. Ao não cancelar esse evento e apenas deixá-los formar perto quando o usuário fecha-lo você vai obter o seu comportamento desejado. Como para todas as outras formas, se você não pretende mostrar esse mesmo exemplo do formulário novamente você apenas deixá-los fechar, em vez de impedir o encerramento e escondê-los. Se estiver a mostrá-los outra vez, então escondê-los pode ser bom.

Se você quer ser capaz de ter o usuário clicar no " x " para o seu formulário Principal, mas ter outro formulário ficar aberto e, com efeito, tornar-se a "nova" forma principal, então é um pouco mais complicado. Nesse caso, terá de esconder a sua forma principal em vez de a fechar, mas terá de adicionar algum tipo de mecanismo que irá {[[12]}na verdade fechar a forma principal quando quiser mesmo que a sua aplicação termine. Se esta é a situação em que você está, então você precisará adicionar mais detalhes à sua pergunta descrevendo quais tipos de aplicações devem e não devem realmente terminar o programa.

 7
Author: Servy, 2012-10-19 16:51:12

Fazes:

Application.Run(myForm);

In your Main()?

Achei uma maneira muito fácil de matar a aplicação quando o formulário está fechado.
 2
Author: LightStriker, 2012-10-19 15:52:00

Eu gostaria de um dos seguintes:

Aplicação.Exit ();

Para uma winform ou

Ambiente.Exit (0);

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

Obrigado!
 1
Author: Techcraft7, 2018-04-20 16:07:34
Environment.Exit(exitCode); //exit code 0 is a proper exit and 1 is an error
 -1
Author: joe pelletier, 2016-04-16 19:56:51

Neste caso, a forma mais adequada de sair da aplicação para substituir o método onExit() na aplicação.xaml.cs:

protected override void OnExit(ExitEventArgs e) {
    base.OnExit(e); 
}
 -2
Author: Anton Tsches, 2018-05-07 15:13:23