Başvurunuzu açık tutmak istiyorsanız, sürecini canlı tutmak için bir şeyler yapmanız gerekir. Aşağıdaki örnek, programınızın sonuna yerleştirilecek en basit örnektir:
while (true) ;
Ancak, CPU'nun aşırı yüklenmesine neden olur, çünkü bu nedenle sonsuz bir şekilde tekrarlamak zorunda kalır.
Bu noktada, System.Windows.Forms.Application
sınıfı kullanmayı tercih edebilirsiniz (ancak System.Windows.Forms
referans eklemenizi gerektirir ):
Application.Run();
Bu CPU sızdırmaz ve başarılı bir şekilde çalışır.
Eklemek kaçınmak amacıyla System.Windows.Forms
referans, basit bir hile, sözde kullanabilir sıkma bekleme ithal System.Threading
:
SpinWait.SpinUntil(() => false);
Bu da mükemmel bir şekilde çalışır ve temel while
olarak yukarıdaki lambda yöntemiyle döndürülen olumsuzlanmış bir koşula sahip bir döngüden oluşur . Bu aşırı CPU neden olmasın? Kaynak koduna buradan bakabilirsiniz ; neyse, temelde tekrar etmeden önce bazı CPU döngüsünü bekler.
Ayrıca, bekleyen mesajları sistemden izleyen ve bir sonraki yinelemeye geçmeden önce her birini işleyen bir mesaj lüper oluşturabilirsiniz:
[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;
}
Ardından, böyle bir şey yaparak güvenli bir şekilde döngü yapabilirsiniz:
while (true)
ProcessMessageOnce();