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çãothis.Hide()
. Isso afecta a forma como a minha candidatura se está a comportar agora?
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?
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
.
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.
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.
Fazes:
Application.Run(myForm);
In your Main()?
Achei uma maneira muito fácil de matar a aplicação quando o formulário está fechado.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!Environment.Exit(exitCode); //exit code 0 is a proper exit and 1 is an error
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);
}