আপনি যদি নিজের অ্যাপ্লিকেশনটি খোলা রাখতে চান তবে এর প্রক্রিয়াটি বাঁচিয়ে রাখতে আপনাকে কিছু করতে হবে। নীচের উদাহরণটি আপনার প্রোগ্রামের শেষে রাখা সহজতম উদাহরণ:
while (true) ;
যাইহোক, এটি সিপিইউকে ওভারলোডের কারণ হিসাবে গ্রহণ করবে কারণ এটি অসীমভাবে পুনরাবৃত্তি করতে বাধ্য হয়।
এই মুহুর্তে, আপনি System.Windows.Forms.Application
ক্লাস ব্যবহার করতে বেছে নিতে পারেন (তবে এটির জন্য আপনাকে System.Windows.Forms
রেফারেন্স যুক্ত করতে হবে ):
Application.Run();
এটি সিপিইউ ফাঁস করে না এবং সফলভাবে কাজ করে।
System.Windows.Forms
রেফারেন্স যুক্ত করতে এড়ানোর জন্য , আপনি একটি সাধারণ কৌশল ব্যবহার করতে পারেন, তথাকথিত স্পিন অপেক্ষারত , আমদানি System.Threading
:
SpinWait.SpinUntil(() => false);
এটিও নিখুঁতভাবে কাজ করে এবং এটি মূলত while
উপরের ল্যাম্বডা পদ্ধতি দ্বারা প্রত্যাবর্তিত অবস্থার সাথে একটি লুপ থাকে consists কেন এই ওভারলোডিং সিপিইউ নয়? আপনি এখানে সোর্স কোডটি দেখতে পারেন ; যাইহোক, এটি মূলত ওভারটি করার আগে কিছু সিপিইউ চক্র অপেক্ষা করে।
আপনি একটি বার্তা লুপও তৈরি করতে পারেন, যা সিস্টেম থেকে মুলতুবি থাকা বার্তাগুলি উঁকি দেয় এবং পরবর্তী পুনরাবৃত্তিতে যাওয়ার আগে সেগুলির প্রতিটি প্রক্রিয়া করে:
[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();