dev - evitar que se cierre la consola c#
¿Por qué la ventana de la consola se cierra inmediatamente sin mostrar mi salida? (18)
el problema aquí es que su Hello World Program se muestra y luego se cerraría de inmediato.
¿porqué es eso?
Porque está terminado. Cuando las aplicaciones de la consola han completado la ejecución y el retorno de su método main
, la ventana de la consola asociada se cierra automáticamente. Este es el comportamiento esperado.
Si desea mantenerlo abierto para la depuración, deberá indicarle a la computadora que espere a que se presione una tecla antes de cerrar la aplicación y cerrar la ventana.
El método Console.ReadLine
es una forma de hacerlo. Agregar esta línea al final de su código (justo antes de la declaración de return
) hará que la aplicación espere a que presione una tecla antes de salir.
Alternativamente, puede iniciar la aplicación sin el depurador conectado presionando Ctrl + F5 desde el entorno de Visual Studio, pero esto tiene la desventaja obvia de impedirle usar las funciones de depuración, que probablemente quiera tener a su disposición al escribir una aplicación.
El mejor compromiso es, probablemente, llamar al método Console.ReadLine
solo al depurar la aplicación envolviéndola en una directiva de preprocesador. Algo como:
#if DEBUG
Console.WriteLine("Press enter to close...");
Console.ReadLine();
#endif
He decidido estudiar C # básico (aunque tengo experiencia en programación), pero estoy siguiendo las guías en MSDN, pero el problema aquí es que su Hello World Program se está mostrando y luego se cerraría de inmediato. ¿porqué es eso?
using System;
public class Hello1
{
public static int Main()
{
Console.WriteLine("Hello, World!");
return 0;
}
}
Agregue el método de Read
para mostrar el resultado.
Console.WriteLine("Hello, World!");
Console.Read();
return 0;
Agregue lo siguiente antes del retorno 0:
system("PAUSE");
Esto imprime una línea para presionar una tecla para cerrar la ventana. Mantendrá la ventana hacia arriba hasta que presione la tecla Intro. Mis alumnos lo agregan a todos sus programas.
Alternativamente, puede retrasar el cierre utilizando el siguiente código:
System.Threading.Thread.Sleep(1000);
Tenga en cuenta que Sleep
está usando milisegundos.
De acuerdo con mi preocupación, si queremos estabilizar la APLICACIÓN DE LA SALIDA DE LA CONSOLA, hasta el cierre de la salida mostrar USE, la etiqueta: después de la MainMethod, y goto label; antes del final del programa
En el programa.
p.ej:
static void Main(string[] args)
{
label:
----------
*****snippet of code*****
-----------
**goto label;**
}
El código está terminado, para continuar necesita agregar esto:
Console.ReadLine();
o
Console.Read();
El programa se cierra inmediatamente porque no hay nada que impida que se cierre. Inserte un punto de interrupción en el return 0;
o agregue Console.Read();
antes de return 0;
para evitar que el programa se cierre.
El programa se cierra tan pronto como se complete la ejecución. En este caso cuando return 0;
. Esta es la funcionalidad esperada. Si desea ver el resultado, ejecútelo en un terminal manualmente o espere al final del programa para que permanezca abierto durante unos segundos (utilizando la biblioteca de subprocesos).
En lugar de usar
Console.Readline()
Console.Read()
Console.ReadKey()
puede ejecutar su programa usando Ctrl + F5 (si está en Visual Studio). Entonces Visual Studio mantendrá la ventana de la consola abierta, hasta que presione una tecla.
Nota: No puede depurar su código en este enfoque.
Esto se comporta de la misma manera con Ctrl F5 o F5 . Coloque inmediatamente antes del final del método Main
.
using System.Diagnostics;
private static void Main(string[] args) {
DoWork();
if (Debugger.IsAttached) {
Console.WriteLine("Press any key to continue . . .");
Console.ReadLine();
}
}
Otra forma es usar Debugger.Break()
antes de regresar del método Main
Para simplificar lo que otros dicen: use Console.ReadKey();
.
Esto hace que el programa esté esperando que el usuario presione una tecla normal en el teclado
Fuente: Lo uso en mis programas para aplicaciones de consola.
Puedes resolverlo de manera muy simple simplemente invocando la entrada. Sin embargo, si presiona Enter
, la consola desaparecerá nuevamente. Simplemente use esta Console.ReadLine();
o Console.Read();
Si desea mantener la aplicación abierta, no puede hacer nada que mantenga vivo el proceso, por lo tanto, observe el siguiente código:
while (true);
Esta es la forma más simple de lograr el comportamiento esperado, pero pierde CPU, que se ve forzada a iterar infinitamente.
En este punto, puede optar por usar System.Windows.Forms.Application
(pero requiere agregar System.Windows.Forms
reference):
Application.Run();
Esto no pierde CPU y funciona con éxito.
Para evitar agregar la referencia de System.Windows.Forms
, puede usar un truco simple, importando System.Threading
:
SpinWait.SpinUntil(() => false);
Esto también funciona perfectamente, y mentalmente consiste en un iterador while
con una condición negada que devuelve el método lambda anterior. ¡Pero no pierde CPU! ¿Por qué? Puedes ver el código fuente aquí , pero básicamente spin espera el hilo actual.
También puede optar por crear un looper de mensaje que eche un vistazo a los mensajes pendientes y procese cada uno de ellos antes de pasar a la siguiente iteración:
[DebuggerHidden, DebuggerStepperBoundary, DebuggerNonUserCode, DllImport("user32.dll", EntryPoint = "PeekMessage")]
public static extern int PeekMessage(out NativeMessage lpMsg, IntPtr hWnd, int wMsgFilterMin, int wMsgFilterMax, int wRemoveMsg);
[DebuggerHidden, DebuggerStepperBoundary, DebuggerNonUserCode, DllImport("user32.dll", EntryPoint = "GetMessage")]
public static extern int GetMessage(out NativeMessage lpMsg, IntPtr hWnd, int wMsgFilterMin, int wMsgFilterMax);
[DebuggerHidden, DebuggerStepperBoundary, DebuggerNonUserCode, DllImport("user32.dll", EntryPoint = "TranslateMessage")]
public static extern int TranslateMessage(ref NativeMessage lpMsg);
[DebuggerHidden, DebuggerStepperBoundary, DebuggerNonUserCode, DllImport("user32.dll", EntryPoint = "DispatchMessage")]
public static extern int DispatchMessage(ref NativeMessage lpMsg);
[DebuggerHidden, DebuggerStepperBoundary, DebuggerNonUserCode]
public static bool ProcessMessageOnce()
{
NativeMessage message = new NativeMessage();
if (!IsMessagePending(out message))
return true;
if (GetMessage(out message, IntPtr.Zero, 0, 0) == -1)
return true;
Message frameworkMessage = new Message()
{
HWnd = message.handle,
LParam = message.lParam,
WParam = message.wParam,
Msg = (int)message.msg
};
if (Application.FilterMessage(ref frameworkMessage))
return true;
TranslateMessage(ref message);
DispatchMessage(ref message);
return false;
}
Entonces puedes hacer bucles de forma segura haciendo algo como esto:
while (true)
ProcessMessageOnce();
También puede hacerlo mejor reemplazando el iterador while
con una invocación SpinWait.SpinUntil
:
SpinWait.SpinUntil(ProcessMessageOnce);
Siempre agrego la siguiente declaración a una aplicación de consola. (Cree un fragmento de código para esto si lo desea)
Console.WriteLine("Press any key to quit!");
Console.ReadKey();
Hacer esto ayuda cuando desea experimentar diferentes conceptos a través de la aplicación de consola.
Ctr + F5 hará que la consola permanezca pero no se puede depurar. Todas las aplicaciones de consola que he escrito en el mundo real son siempre no interactivas y se activan mediante un Programador como TWS o CA Work station y no requieren algo como esto.
Supongo que la razón por la que no quiere que se cierre en el modo de depuración es porque quiere ver los valores de las variables, etc. Por lo tanto, es mejor simplemente insertar un punto de corte en el cierre "}" de la función principal . Si no necesita depurar, entonces Ctrl-F5 es la mejor opción.
Use Console.Read (); para evitar que el programa se cierre, pero asegúrese de agregar Console.Read();
código antes de declaración return, o de lo contrario será un código inalcanzable.
Console.Read();
return 0;
revisa esta consola. Leer
si su programa requiere que presione enter para continuar como debe ingresar un valor y continuar, luego agregue un nuevo doble o int y escriba write antes de retunr (0); scanf_s ("% lf", & la variable);