Si desea mantener abierta su aplicación, debe hacer algo para mantener vivo su proceso. El siguiente ejemplo es el más simple, que se colocará al final de su programa:
while (true) ;
Sin embargo, hará que la CPU se sobrecargue, ya que por lo tanto se ve obligada a iterar infinitamente.
En este punto, puede optar por usar la System.Windows.Forms.Applicationclase (pero requiere que agregue System.Windows.Formsreferencia):
Application.Run();
Esto no pierde la CPU y funciona con éxito.
Para evitar agregar System.Windows.Formsreferencias, puede usar un simple truco, el llamado giro en espera , importando System.Threading:
SpinWait.SpinUntil(() => false);
Esto también funciona perfectamente, y básicamente consiste en un whilebucle con una condición negada que es devuelta por el método lambda anterior. ¿Por qué no se sobrecarga esta CPU? Puedes ver el código fuente aquí ; de todos modos, básicamente espera un ciclo de CPU antes de repetir.
También puede crear un bucleador de mensajes, que mira los mensajes pendientes del sistema y procesa cada uno de ellos antes de pasar a la siguiente iteración, de la siguiente manera:
[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;
}
Luego, puede realizar un bucle de forma segura haciendo algo como esto:
while (true)
ProcessMessageOnce();