在子執行緒中建立新的窗體,遇到的問題。

憤怒的TryCatch發表於2015-12-01
場景:

  服務端的應用程式建立了一個執行緒來接收客戶端發來的訊息,當接收到訊息後,需要彈出一個新的窗體,作為響應操作等。

現象:

  新建立的窗體呈現掛起、假死,或者一閃而過的現象。

原因:

  新建立的響應窗體是由子執行緒建立的,而.net平臺下,子執行緒執行完畢後,會自動釋放資源,同樣的,這個新建立的窗體也會被釋放掉。若是這個執行緒處於監聽或者一些其他的連續執行狀態,那麼,這個窗體就會出現假死狀態。

解決方案:

  可以在子執行緒中呼叫一個程式碼段,而這個程式碼段通過invoke方法回答主執行緒中去建立和現實Form2,這樣,子執行緒完成後,Form2就不會被釋放掉,因為它屬於主執行緒。

示例程式碼:

(示例一)

1 //this表示主視窗的類
2 this.Invoke((MethodInvoker)delegate
3 {
4      f = new Form2();
5      f.Show();
6 });

(示例二)

1 //也可以這樣寫
2 new Thread((ThreadStart)delegate
3 {
4     Application.Run(new Form2());
5 }).Start();

 

相關文章