यदि आप अपने आवेदन को खोलकर रखना चाहते हैं, तो आपको इसकी प्रक्रिया को जीवित रखने के लिए कुछ करना होगा। नीचे दिया गया उदाहरण सबसे सरल है, जिसे आपके कार्यक्रम के अंत में रखा जाना है:
while (true) ;
हालाँकि, यह सीपीयू को अधिक भार का कारण बना देगा, क्योंकि यह इसलिए असीम रूप से पुनरावृति के लिए मजबूर है।
इस बिंदु पर, आप System.Windows.Forms.Application
कक्षा का उपयोग करने का विकल्प चुन सकते हैं (लेकिन इसके लिए आपको System.Windows.Forms
संदर्भ जोड़ना होगा ):
Application.Run();
यह CPU को लीक नहीं करता है और सफलतापूर्वक काम करता है।
System.Windows.Forms
संदर्भ जोड़ने से बचने के लिए , आप एक साधारण चाल का उपयोग कर सकते हैं, तथाकथित स्पिन प्रतीक्षा , आयात कर रहे हैंSystem.Threading
:
SpinWait.SpinUntil(() => false);
यह भी पूरी तरह से काम करता है, और इसमें मूल रूप while
से एक नकारात्मक स्थिति के साथ एक लूप शामिल होता है जो उपरोक्त लैम्बडा विधि द्वारा वापस किया जाता है। क्यों यह सीपीयू अधिभार नहीं है? आप यहां स्रोत कोड देख सकते हैं ; वैसे भी, यह मूल रूप से खत्म होने से पहले कुछ सीपीयू चक्र की प्रतीक्षा करता है।
आप एक संदेश लूपर भी बना सकते हैं, जो सिस्टम से लंबित संदेशों को पेश करता है और उनमें से प्रत्येक को अगले पुनरावृत्ति में जाने से पहले संसाधित करता है, इस प्रकार है:
[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();