首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# WinForm 跨執行緒存取控制項問題 (2) — BeginInvoke 陷阱:UI 執行緒被佔用導致介面凍結

     編輯:關於C語言

常見但錯誤的 BeginInvoke 寫法

網路上許多範例直接在背景執行緒用 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 更新。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved