在非 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 線程上下文。
void show() {
this.Invoke(new Action(() => {
if (saveFileDialog1.ShowDialog() == DialogResult.OK) { /* ... */ }
}));
}
Invoke 將委託排入 UI 線程消息隊列同步執行,確保線程安全。
優先使用方法二,避免設置 CheckForIllegalCrossThreadCalls = false 這種不安全的全局開關。所有跨線程 UI 操作都應通過 Invoke/BeginInvoke 進行。