首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 子線程響應主線程按鈕點擊事件的正確模式

     編輯:程式設計綜合問答

問題場景

在 WinForms 應用中,主線程(UI 線程)包含按鈕,子線程中定義的類需要獲取按鈕點擊事件並執行後續任務。直接跨線程訪問 UI 控件會拋出異常,需採用線程安全的通信機制。

推薦解決方案:事件驅動模式

  1. 主線程訂閱事件:在 Form 中處理按鈕 `Click` 事件。
  2. 發布自定義事件:點擊時觸發自定義事件(如 `TaskRequested`),攜帶必要參數。
  3. 子線程監聽事件:子線程中的類訂閱該事件,收到通知後執行業務邏輯。

代碼示例

// 定義事件參數
public class TaskEventArgs : EventArgs {
    public string Parameter { get; set; }
}

// 主線程 Form
public partial class MainForm : Form {
    public event EventHandler<TaskEventArgs> TaskRequested;

    private void btnStart_Click(object sender, EventArgs e) {
        TaskRequested?.Invoke(this, new TaskEventArgs { Parameter = "data" });
    }
}

// 子線程類
public class Worker {
    public void Subscribe(MainForm form) {
        form.TaskRequested += OnTaskRequested;
    }

    private void OnTaskRequested(object sender, TaskEventArgs e) {
        // 在此執行耗時任務,若需更新 UI 請用 Invoke/BeginInvoke
        Task.Run(() => DoWork(e.Parameter));
    }
}

注意事項

  • 切勿在子線程直接操作 UI 控件,必須通過 `Control.Invoke` 或 `SynchronizationContext` 回發到 UI 線程。
  • 考慮使用 `async/await` 配合 `Progress` 類簡化異步協調。
  • 事件發布者與訂閱者生命週期管理,避免內存洩漏。

C# 子線程響應主線程按鈕點擊,事件驅動模式,跨線程 UI 操作安全實踐。

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