在 C# WinForms 應用程式的 Program.cs 中,開發者常嘗試在 Application.Run(new Form1()) 之後繼續執行程式碼,卻發現後續程式碼永遠不會被執行。這是因為 Application.Run 會啟動訊息迴圈並阻塞當前執行緒,直到表單關閉為止。
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
// xxxx 操作
if (true)
{
Application.Run(new Form1()); // 這裡會阻塞
}
// xxxx 操作 - 永遠不會執行到這裡
}
}
若需在表單顯示後立即執行邏輯,應將程式碼移至表單的 Load 事件中,而非寫在 Application.Run 之後。
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var f1 = new Form1();
f1.Load += (sender, e) =>
{
// 在這裡執行原本想放在 Application.Run 後面的程式碼
// xxx操作
};
Application.Run(f1);
}
}
若不需要模態對話框,可改用 form.Show() 並自行管理訊息迴圈,但這在標準 WinForms 應用中較少見,通常建議採用事件驅動模式。
Application.Run 會啟動 Windows 訊息泵,這是一個無限迴圈,負責分派視窗訊息。掌握這個原理,即可避免「主執行緒被卡死」的誤區,編寫流暢的 WinForms 應用程式。