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.Application
clase (pero requiere que agregue System.Windows.Forms
referencia):
Application.Run();
Esto no pierde la CPU y funciona con éxito.
Para evitar agregar System.Windows.Forms
referencias, 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 while
bucle 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();