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

C# WinForms 關閉舊視窗開新視窗:新執行緒 Application.Run 模式 (非標準,慎用)

     編輯:程式設計綜合問答

代碼


this.Close(); 
new System.Threading.Thread(() => { 
    Application.Run(new Form2()); 
}).Start();

解析

  • `this.Close()` 結束當前視窗的訊息迴圈 (`Application.Run` 返回)。
  • 新 `Thread` 啟動,`SetApartmentState(STA)` (隱含),`Application.Run(new Form2())` 建立**第二個獨立訊息迴圈**。
  • 此時進程擁有**兩個 UI 執行緒** (若舊視窗未完全銷毀) 或**一個新 UI 執行緒**。

嚴重缺陷

  1. `Application.Exit()` **只結束呼叫它的執行緒訊息迴圈**,另一個迴圈繼續跑,進程不退出。
  2. 全域資源 (單例、靜態事件、資料庫連線池) 共享兩個 UI 執行緒,**執行緒安全風險極高**。
  3. Visual Studio 設計器、元件拖曳、資源釋放模式**均假設單一 UI 執行緒**。
  4. 任務管理器顯示「無回應」機率增加。

正確替代方案


// 方案 A:隱藏舊視窗 (推薦)
Form2 frm2 = new Form2();
frm2.FormClosed += (s, e) => this.Show(); // 關閉新視窗回來
frm2.Show();
this.Hide();

// 方案 B:單一主視窗 + 切換 UserControl (最佳架構)
public void SwitchToForm2() {
    panelMain.Controls.Clear();
    var uc = new UserControlForm2(); // 將 Form2 內容移入 UserControl
    uc.Dock = DockStyle.Fill;
    panelMain.Controls.Add(uc);
}

總結

**新執行緒 `Application.Run` 切換主視窗是反模式**,會導致進程退出異常、資源洩漏、執行緒安全噩夢。**請用 `Hide/Show` 或單一主視窗 `Panel` 切換 `UserControl`**。

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