Endereçando casos que algumas das outras respostas não lidam bem:
- Responsivo : execução direta do código de manipulação de teclas; evita os caprichos de pesquisas ou bloqueios de atrasos
- Possibilidade de Opção : keypress global é opt-in ; caso contrário, o aplicativo deve sair normalmente
- Separação de preocupações : código de escuta menos invasivo; opera independentemente do código do aplicativo de console normal.
Muitas das soluções nesta página envolvem pesquisa Console.KeyAvailable
ou bloqueio Console.ReadKey
. Embora seja verdade que o .NET Console
não seja muito cooperativo aqui, você pode usar Task.Run
para avançar em direção a umAsync
modo de escuta .
O principal problema a ser observado é que, por padrão, o encadeamento do console não está configurado para Async
operação - o que significa que, quando você fica fora da parte inferior da sua main
função, em vez de esperar pela Async
conclusão, o AppDoman e o processo terminam. . Uma maneira adequada de resolver isso seria usar o AsyncContext de Stephen Cleary para estabelecer Async
suporte total ao seu programa de console de thread único. Mas para casos mais simples, como esperar por um pressionamento de tecla, instalar um trampolim completo pode ser um exagero.
O exemplo abaixo seria para um programa de console usado em algum tipo de arquivo em lote iterativo. Nesse caso, quando o programa é concluído, normalmente ele deve sair sem a necessidade de pressionar a tecla e, em seguida, permitimos que a tecla opcional seja pressionada para impedir a saída do aplicativo. Podemos pausar o ciclo para examinar as coisas, possivelmente retomar ou usar a pausa como um 'ponto de controle' conhecido no qual interromper o arquivo em lotes de maneira limpa.
static void Main(String[] args)
{
Console.WriteLine("Press any key to prevent exit...");
var tHold = Task.Run(() => Console.ReadKey(true));
// ... do your console app activity ...
if (tHold.IsCompleted)
{
#if false // For the 'hold' state, you can simply halt forever...
Console.WriteLine("Holding.");
Thread.Sleep(Timeout.Infinite);
#else // ...or allow continuing to exit
while (Console.KeyAvailable)
Console.ReadKey(true); // flush/consume any extras
Console.WriteLine("Holding. Press 'Esc' to exit.");
while (Console.ReadKey(true).Key != ConsoleKey.Escape)
;
#endif
}
}