Wenn Sie Ihre Anwendung geöffnet lassen möchten, müssen Sie etwas tun, um den Prozess am Leben zu erhalten. Das folgende Beispiel ist das einfachste, das am Ende Ihres Programms steht:
while (true) ;
Dies führt jedoch zu einer Überlastung der CPU, da diese daher unendlich iterieren muss.
An dieser Stelle können Sie sich für die Verwendung der System.Windows.Forms.Application
Klasse entscheiden (Sie müssen jedoch eine System.Windows.Forms
Referenz hinzufügen ):
Application.Run();
Dies leckt keine CPU und funktioniert erfolgreich.
Um das Hinzufügen von System.Windows.Forms
Referenzen zu vermeiden , können Sie einen einfachen Trick verwenden, das sogenannte Spin-Warten und Importieren System.Threading
:
SpinWait.SpinUntil(() => false);
Dies funktioniert auch perfekt und besteht im Wesentlichen aus einer while
Schleife mit einer negierten Bedingung, die von der obigen Lambda-Methode zurückgegeben wird. Warum ist diese CPU nicht überlastet? Den Quellcode können Sie hier einsehen. Trotzdem wartet es im Grunde einen CPU-Zyklus, bevor es wiederholt wird.
Sie können auch einen Nachrichten-Looper erstellen, der die ausstehenden Nachrichten aus dem System überprüft und verarbeitet, bevor er zur nächsten Iteration übergeht.
[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;
}
Dann können Sie sicher eine Schleife ausführen, indem Sie Folgendes tun:
while (true)
ProcessMessageOnce();