Si vous souhaitez garder votre application ouverte, vous devez faire quelque chose pour maintenir son processus en vie. L'exemple ci-dessous est le plus simple, à mettre à la fin de votre programme:
while (true) ;
Cependant, cela entraînera une surcharge du processeur, car il est donc obligé d'itérer à l'infini.
À ce stade, vous pouvez choisir d'utiliser la System.Windows.Forms.Application
classe (mais cela vous oblige à ajouter une System.Windows.Forms
référence):
Application.Run();
Cela ne fuit pas le processeur et fonctionne avec succès.
Afin d'éviter d'ajouter une System.Windows.Forms
référence, vous pouvez utiliser une astuce simple, la soi-disant attente de rotation , en important System.Threading
:
SpinWait.SpinUntil(() => false);
Cela fonctionne également parfaitement et consiste essentiellement en une while
boucle avec une condition négative renvoyée par la méthode lambda ci-dessus. Pourquoi ce processeur ne surcharge-t-il pas? Vous pouvez consulter le code source ici ; Quoi qu'il en soit, il attend essentiellement un cycle du processeur avant de recommencer.
Vous pouvez également créer un boucleur de messages, qui examine les messages en attente du système et traite chacun d'eux avant de passer à l'itération suivante, comme suit:
[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;
}
Ensuite, vous pouvez boucler en toute sécurité en faisant quelque chose comme ceci:
while (true)
ProcessMessageOnce();