網路上許多範例直接在背景執行緒用 BeginInvoke 封送含無限迴圈的方法:
private void CrossThreadFlush() {
FlushClient fc = new FlushClient(ThreadFunction);
this.BeginInvoke(fc); // 注入主執行緒
}
private void ThreadFunction() {
while (true) {
this.textBox1.Text = DateTime.Now.ToString();
Thread.Sleep(1000);
}
}
BeginInvoke 將背景執行緒的工作「注入」到 UI 執行緒執行。只要該委派不返回(無限迴圈),UI 執行緒永遠被佔用,無法處理訊息迴圈,介面自然無回應。即使移除迴圈,也違背多執行緒初衷。
結論:不能在委派中執行長時間/無限迴圈工作,必須讓背景執行緒自行迴圈,僅透過 Invoke/BeginInvoke 做瞬間 UI 更新。