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

C# Form.ShowDialog(this) 線程間調用問題解決

     編輯:關於C++

問題現象

在非 UI 線程中直接呼叫 ShowDialog() 會導致對話框不顯示且不報錯。原因是 UI 操作必須在建立控制項的線程(通常是主線程)執行。

解決方法

方法一:傳遞擁有者參數

private void button1_Click(object sender, EventArgs e) {
    Thread thread = new Thread(show);
    thread.Start();
}
void show() {
    Control.CheckForIllegalCrossThreadCalls = false; // 不推薦,僅示例
    if (saveFileDialog1.ShowDialog(this) == DialogResult.OK) { /* ... */ }
}

ShowDialog(IWin32Window owner) 指定擁有者視窗,使對話框依附於正確的 UI 線程上下文。

方法二:使用 Invoke 回主線程

void show() {
    this.Invoke(new Action(() => {
        if (saveFileDialog1.ShowDialog() == DialogResult.OK) { /* ... */ }
    }));
}

Invoke 將委託排入 UI 線程消息隊列同步執行,確保線程安全。

建議

優先使用方法二,避免設置 CheckForIllegalCrossThreadCalls = false 這種不安全的全局開關。所有跨線程 UI 操作都應通過 Invoke/BeginInvoke 進行。

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