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

C# WinForm 跨執行緒存取控制項問題 (3) — 推薦解決方案:InvokeRequired 模式

     編輯:關於C語言

推薦解法:非同步等待 + Invoke

將 Sleep 與無限迴圈移至等待非同步的外層,透過 InvokeRequired 判斷是否需跨執行緒呼叫:

public partial class Form1 : Form {
    private delegate void FlushClient();
    public Form1() { InitializeComponent(); }

    private void Form1_Load(object sender, EventArgs e) {
        Thread thread = new Thread(CrossThreadFlush);
        thread.IsBackground = true;
        thread.Start();
    }

    private void CrossThreadFlush() {
        while (true) {
            Thread.Sleep(1000); // 外層睡眠
            ThreadFunction();
        }
    }

    private void ThreadFunction() {
        if (this.textBox1.InvokeRequired) {
            FlushClient fc = new FlushClient(ThreadFunction);
            this.Invoke(fc); // 透過委派非同步封送回 UI 執行緒
        } else {
            this.textBox1.Text = DateTime.Now.ToString();
        }
    }
}

執行結果:問題解決。InvokeRequired 確保不持續佔用主執行緒,避免跨執行緒異常,同時保持 UI 回應。

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