Como posso continuar executando meu aplicativo de console até pressionar uma tecla (como Escé pressionado?)
Estou assumindo que está enrolado em um loop while. Não gosto ReadKey
, pois bloqueia a operação e pede uma tecla, em vez de apenas continuar e ouvir a pressão da tecla.
Como isso pode ser feito?
c#
console-application
karlstackoverflow
fonte
fonte
Console.ReadLine()
e pronto, não?Você pode alterar sua abordagem levemente - use
Console.ReadKey()
para interromper seu aplicativo, mas faça seu trabalho em um encadeamento em segundo plano:Na
myWorker.DoStuff()
função, você invocaria outra função em um encadeamento em segundo plano (usandoAction<>()
ouFunc<>()
é uma maneira fácil de fazê-lo) e retornará imediatamente.fonte
O caminho mais curto:
Console.ReadKey()
é uma função de bloqueio, interrompe a execução do programa e aguarda um pressionamento de tecla, mas, graças à verificaçãoConsole.KeyAvailable
primeiro, owhile
loop não é bloqueado, mas continua executando até que o Escbotão seja pressionado.fonte
Da maldição do vídeo Construindo aplicativos do console .NET em C # por Jason Roberts em http://www.pluralsight.com
Poderíamos fazer o seguinte para ter vários processos em execução
fonte
Console.CursorVisible = false;
será melhor evitar as piscadas do cursor. Adicione esta linha como primeira linha nostatic void Main(string[] args)
bloco.Aqui está uma abordagem para você fazer algo em um segmento diferente e começar a ouvir a tecla pressionada em um segmento diferente. E o console interromperá o processamento quando o processo real terminar ou o usuário finalizar o processo pressionando a Esctecla.
fonte
Se você estiver usando o Visual Studio, poderá usar "Iniciar sem depuração" no menu Debug.
Ele escreverá automaticamente "Pressione qualquer tecla para continuar..." para o console para você após a conclusão do aplicativo e ele deixará o console aberto até que uma tecla seja pressionada.
fonte
Endereçando casos que algumas das outras respostas não lidam bem:
Muitas das soluções nesta página envolvem pesquisa
Console.KeyAvailable
ou bloqueioConsole.ReadKey
. Embora seja verdade que o .NETConsole
não seja muito cooperativo aqui, você pode usarTask.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 suamain
função, em vez de esperar pelaAsync
conclusão, o AppDoman e o processo terminam. . Uma maneira adequada de resolver isso seria usar o AsyncContext de Stephen Cleary para estabelecerAsync
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.
fonte
com o código abaixo, você pode ouvir SpaceBar pressionando, no meio da execução do console e pausar até que outra tecla seja pressionada e também ouvir o EscapeKey para interromper o loop principal
fonte
De acordo com minha experiência, em aplicativos de console, a maneira mais fácil de ler a última tecla pressionada é a seguinte (exemplo com as setas):
Eu uso para evitar loops, em vez disso, escrevo o código acima em um método e o chamo no final de "Method1" e "Method2", portanto, depois de executar "Method1" ou "Method2", Console.ReadKey () .Key está pronto para ler as teclas novamente.
fonte