Como posso manter um aberto console até evento CancelKeyPress é disparado?

StackOverflow https://stackoverflow.com/questions/203246

  •  03-07-2019
  •  | 
  •  

Pergunta

Qual é a melhor maneira de manter um aberto aplicativo de console, enquanto o evento CancelKeyPress não foi demitido?

Eu preferiria não usar Console.Read ou Console.ReadLine como eu não quero aceitar a entrada. Eu só quero permitir a aplicação subjacente para imprimir os detalhes do console de eventos como eles são disparados. Então uma vez que o evento é disparado CancelKeyPress Quero fechar graciosamente o aplicativo.

Foi útil?

Solução

Estou assumindo que "graciosamente desligar o aplicativo" é a parte que você está lutando com aqui. Caso contrário, o aplicativo irá automaticamente sair em ctrl-c. Você deve alterar o título.

Aqui está uma demonstração rápida do que eu acho que você precisa. Pode ser um pouco mais refinado com a utilização de bloqueio e monitores para notificação. Eu não sei exatamente o que você precisa, então eu vou colocar esta ...

class Program
{

    private static volatile bool _s_stop = false;

    public static void Main(string[] args)
    {
        Console.CancelKeyPress += new ConsoleCancelEventHandler(Console_CancelKeyPress);
        while (!_s_stop)
        {
            /* put real logic here */
            Console.WriteLine("still running at {0}", DateTime.Now);
            Thread.Sleep(3000);
        }
        Console.WriteLine("Graceful shut down code here...");

        //don't leave this...  demonstration purposes only...
        Console.ReadLine();
    }

    static void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e)
    {
        //you have 2 options here, leave e.Cancel set to false and just handle any
        //graceful shutdown that you can while in here, or set a flag to notify the other
        //thread at the next check that it's to shut down.  I'll do the 2nd option
        e.Cancel = true;
        _s_stop = true;
        Console.WriteLine("CancelKeyPress fired...");
    }

}

O boolean _s_stop deve ser declarado volátil ou um otimizador excessivamente ambicioso pode causar o programa para loop infinito.

Outras dicas

O boolean _s_stop deve ser declarado volátil no código de exemplo, ou um otimizador excessivamente ambicioso pode causar o programa para loop infinito.

Já existe um manipulador obrigado a CancelKeyPress que termina a sua aplicação, a única razão para ligar para ele é se você quiser interceptar o evento e evitar a aplicação de fechamento.

Na sua situação, basta colocar seu aplicativo em um loop infinito, e deixar que o construído em manipulador de eventos matá-lo. Você pode querer olhar em usar algo como Wait (1) ou um processo de fundo para impedi-lo de usar toneladas de CPU enquanto não fazer nada.

Basta executar o seu programa ou códigos sem a depuração, em sua tecla do teclado em Ctrl + F5 em vez de F5 (depuração).

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