單一執行緒 GUI 程式中,長時間運算 (資料庫查詢、複雜計算) 會阻塞訊息迴圈,導致介面凍結:無法點擊、輸入、重繪、關閉視窗。解決方案:**UI 執行緒專責訊息泵,背景執行緒處理耗時工作**。
void OnClick(object sender, EventArgs e)
{
int seconds = int.Parse(textBox.Text);
for (int i = 0; i < seconds; i++)
{
Interaction.Beep();
Thread.Sleep(1000);
}
}

輸入 20 秒,介面完全無回應 20 秒 (無法移動、重繪、關閉)。
WndProc 處理訊息GetMessage / DispatchMessage (訊息泵)Application.Run() 封裝訊息泵,主執行緒終身阻塞於此OnClick) 在 **同一主執行緒** 執行長時間運算佔用主執行緒 → 訊息泵停止 → 介面凍結。
void OnClick(object sender, EventArgs e)
{
int seconds = int.Parse(textBox.Text);
WaitCallback work = new WaitCallback(Count);
ThreadPool.QueueUserWorkItem(work, seconds);
}
void Count(object param)
{
int seconds = (int)param;
for (int i = 0; i < seconds; i++)
{
Interaction.Beep();
Thread.Sleep(1000);
}
}
ThreadPool.QueueUserWorkItem 將工作排入佇列,CLR 執行緒池執行,主執行緒立即返回處理訊息。**介面保持回應**。
使用者可連續點擊按鈕啟動多個背景工作,造成資源爭用或資料損毀。
delegate void BoolCallback(bool enable);
BoolCallback _enableControls;
public Form1()
{
// ...
_enableControls = new BoolCallback(EnableControls);
}
void OnClick(object sender, EventArgs e)
{
EnableControls(false); // 立即停用
ThreadPool.QueueUserWorkItem(Count, seconds);
}
void Count(object param)
{
// ... 背景工作 ...
Invoke(_enableControls, new object[] { true }); // 完成後啟用
}
void EnableControls(bool enable)
{
button.Enabled = enable;
textBox.Enabled = enable;
}
Control.Invoke:將委派排入 **UI 執行緒** 執行佇列,**唯一可從任何執行緒安全呼叫的控制項方法** (內部用 PostMessage)AutoResetEvent:兩狀態 (有訊號/無訊號) 執行緒同步基元。
AutoResetEvent _cancelEvent = new AutoResetEvent(false)_cancelEvent.Set()if (_cancelEvent.WaitOne(0, false)) // 0 毫秒逾時,非阻塞檢查
{
// 執行取消邏輯
return;
}
WaitOne(0) 立即返回:true = 有訊號 (使用者取消),false = 逾時 (未取消)若背景作業不可真正取消 (如 DataAdapter.Fill),可採用偽取消:
| 特性 | System.Windows.Forms.Timer | System.Threading.Timer |
|---|---|---|
| 執行緒 | UI 執行緒 (WM_TIMER 訊息) | ThreadPool 執行緒 |
| 同步需求 | 無 | 需 Invoke/同步機制 |
| 精確度 | ~55ms (訊息迴圈) | 較高 |
| 適用場景 | UI 週期性更新 (時鐘、狀態列) | 非 UI 背景週期性工作 |
原則: Windows Forms 專案**優先使用 System.Windows.Forms.Timer**,除非明確需要 ThreadPool 回呼。
下一代 UI 架構中,每個 UI 元素關聯邏輯執行緒上下文 (UIContext),提供 Invoke/BeginInvoke,邏輯與 WinForms Control.Invoke 一致。