หากคุณต้องการให้แอปพลิเคชันของคุณเปิดอยู่คุณต้องทำอะไรบางอย่างเพื่อให้กระบวนการใช้งานได้ ตัวอย่างด้านล่างเป็นตัวอย่างที่ง่ายที่สุดที่จะนำมาวางที่ส่วนท้ายของโปรแกรมของคุณ:
while (true) ;
อย่างไรก็ตามมันจะทำให้ซีพียูโอเวอร์โหลดเนื่องจากมันถูกบังคับให้ทำซ้ำอย่างไม่ จำกัด
ณ จุดนี้คุณสามารถเลือกที่จะใช้System.Windows.Forms.Application
คลาส (แต่คุณต้องเพิ่มSystem.Windows.Forms
การอ้างอิง):
Application.Run();
สิ่งนี้ไม่ทำให้ CPU รั่วไหลและทำงานได้สำเร็จ
เพื่อหลีกเลี่ยงการเพิ่มSystem.Windows.Forms
การอ้างอิงคุณสามารถใช้เคล็ดลับง่ายๆที่เรียกว่าหมุนรอคอยการนำเข้าSystem.Threading
:
SpinWait.SpinUntil(() => false);
สิ่งนี้ยังทำงานได้อย่างสมบูรณ์และโดยทั่วไปประกอบด้วยwhile
ลูปที่มีเงื่อนไขที่ส่งคืนโดยวิธีแลมบ์ดาด้านบน ทำไม CPU ถึงไม่โหลดมากเกินไป? คุณสามารถดูซอร์สโค้ดที่นี่ ; อย่างไรก็ตามโดยทั่วไปจะรอรอบ CPU ก่อนที่จะวนซ้ำ
คุณยังสามารถสร้างข้อความตัวส่งข้อความซึ่งจะดูข้อความที่ค้างอยู่จากระบบและประมวลผลแต่ละข้อความก่อนส่งผ่านไปยังการวนซ้ำครั้งถัดไปดังนี้:
[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;
}
จากนั้นคุณสามารถวนลูปได้อย่างปลอดภัยโดยทำสิ่งนี้:
while (true)
ProcessMessageOnce();