Se você deseja manter seu aplicativo aberto, é necessário fazer algo para manter seu processo ativo. O exemplo abaixo é o mais simples, a ser colocado no final do seu programa:
while (true) ;
No entanto, isso fará com que a CPU sobrecarregue, pois é forçada a iterar infinitamente.
Neste ponto, você pode optar por usar a System.Windows.Forms.Application
classe (mas requer que você adicione System.Windows.Forms
referência):
Application.Run();
Isso não vaza a CPU e funciona com sucesso.
Para evitar adicionar System.Windows.Forms
referências, você pode usar um truque simples, o chamado giro em espera , importando System.Threading
:
SpinWait.SpinUntil(() => false);
Isso também funciona perfeitamente e basicamente consiste em um while
loop com uma condição negada retornada pelo método lambda acima. Por que essa CPU não sobrecarrega? Você pode olhar o código fonte aqui ; de qualquer maneira, basicamente espera algum ciclo da CPU antes de repetir.
Você também pode criar um looper de mensagem, que exibe as mensagens pendentes do sistema e processa cada uma delas antes de passar para a próxima iteração, da seguinte maneira:
[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;
}
Em seguida, você pode fazer um loop com segurança fazendo algo assim:
while (true)
ProcessMessageOnce();