Jika Anda ingin aplikasi Anda tetap terbuka, Anda harus melakukan sesuatu agar prosesnya tetap hidup. Contoh di bawah ini adalah yang paling sederhana, untuk diletakkan di akhir program Anda:
while (true) ;
Namun, itu akan menyebabkan CPU kelebihan beban, karena itu dipaksa untuk mengulangi tanpa batas.
Pada titik ini, Anda dapat memilih untuk menggunakan System.Windows.Forms.Application
kelas (tetapi mengharuskan Anda untuk menambahkan System.Windows.Forms
referensi):
Application.Run();
Ini tidak membocorkan CPU dan berhasil.
Untuk menghindari menambahkan System.Windows.Forms
referensi, Anda dapat menggunakan trik sederhana, yang disebut spin waiting , mengimpor System.Threading
:
SpinWait.SpinUntil(() => false);
Ini juga berfungsi dengan baik, dan pada dasarnya terdiri dari while
loop dengan kondisi negated yang dikembalikan oleh metode lambda di atas. Mengapa CPU ini tidak kelebihan beban? Anda dapat melihat kode sumber di sini ; bagaimanapun, pada dasarnya menunggu beberapa siklus CPU sebelum iterasi.
Anda juga dapat membuat looper pesan, yang mengintip pesan yang tertunda dari sistem dan memproses masing-masing sebelum meneruskan ke iterasi berikutnya, sebagai berikut:
[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;
}
Kemudian, Anda dapat mengulang dengan aman dengan melakukan sesuatu seperti ini:
while (true)
ProcessMessageOnce();