¿Cómo puedo continuar ejecutando mi aplicación de consola hasta que presione una tecla (como Escpresionar?)
Supongo que está envuelto en un bucle while. No me gusta, ReadKey
ya que bloquea la operación y pide una tecla, en lugar de continuar y escuchar la presión de la tecla.
¿Cómo se puede hacer esto?
c#
console-application
karlstackoverflow
fuente
fuente
Console.ReadLine()
y ya está, ¿no?Puede cambiar su enfoque ligeramente: use
Console.ReadKey()
para detener su aplicación, pero haga su trabajo en un hilo de fondo:En la
myWorker.DoStuff()
función, invocaría otra función en un subproceso en segundo plano (usandoAction<>()
oFunc<>()
es una forma fácil de hacerlo), y luego volverá inmediatamente.fuente
El camino más corto:
Console.ReadKey()
es una función de bloqueo, detiene la ejecución del programa y espera la pulsación de una tecla, pero gracias a la comprobaciónConsole.KeyAvailable
inicial, elwhile
bucle no está bloqueado, sino que se ejecuta hasta que Escse presiona.fuente
De la maldición en video Creación de aplicaciones de consola .NET en C # por Jason Roberts en http://www.pluralsight.com
Podríamos hacer lo siguiente para tener un proceso de ejecución múltiple
fuente
Console.CursorVisible = false;
Será mejor evitar los parpadeos del cursor. Agregue esta línea como primera línea en elstatic void Main(string[] args)
bloque.Aquí hay un enfoque para que usted haga algo en un hilo diferente y comience a escuchar la tecla presionada en un hilo diferente. Y la consola detendrá su procesamiento cuando finalice su proceso real o el usuario finalice el proceso presionando la Esctecla.
fuente
Si está utilizando Visual Studio, puede usar "Iniciar sin depurar" en el menú Depurar.
Se escribirá automáticamente "Presione cualquier tecla para continuar..." a la consola para usted al completar la aplicación y dejará la consola abierta para usted hasta que se presione una tecla.
fuente
Abordar casos que algunas de las otras respuestas no manejan bien:
Muchas de las soluciones en esta página implican sondeo
Console.KeyAvailable
o bloqueoConsole.ReadKey
. Si bien es cierto que .NETConsole
no es muy cooperativo aquí, puede usarloTask.Run
para avanzar hacia unAsync
modo de escucha más moderno .El problema principal a tener en cuenta es que, de manera predeterminada, el subproceso de la consola no está configurado para
Async
funcionar, lo que significa que, cuando se cae del fondo de sumain
función, en lugar de esperar laAsync
finalización, su AppDoman y el proceso finalizarán . Una forma adecuada de abordar esto sería utilizar el AsyncContext de Stephen Cleary para establecer unAsync
soporte completo en su programa de consola de un solo subproceso. Pero para casos más simples, como esperar una pulsación de tecla, instalar un trampolín completo puede ser excesivo.El siguiente ejemplo sería para un programa de consola utilizado en algún tipo de archivo por lotes iterativo. En este caso, cuando el programa termina con su trabajo, normalmente debería salir sin necesidad de presionar una tecla, y luego permitimos presionar una tecla opcional para evitar que la aplicación salga. Podemos pausar el ciclo para examinar cosas, posiblemente reanudar, o usar la pausa como un 'punto de control' conocido en el que se puede salir limpiamente del archivo por lotes.
fuente
con el siguiente código, puede escuchar la barra espaciadora presionando, en medio de la ejecución de su consola y pausar hasta que se presione otra tecla y también escuchar EscapeKey para romper el bucle principal
fuente
Según mi experiencia, en las aplicaciones de consola, la forma más fácil de leer la última tecla presionada es la siguiente (Ejemplo con teclas de flecha):
Yo uso para evitar bucles, en su lugar escribo el código anterior dentro de un método, y lo llamo al final de "Método1" y "Método2", por lo tanto, después de ejecutar "Método1" o "Método2", Console.ReadKey () .Key está listo para leer las claves nuevamente.
fuente