自己在寫socket通訊碰到這樣的問題:
除主UI線程外,有一個後台socket監聽線程一直在監聽新消息,新消息到來後,右下角彈出一個新窗口提醒用戶。
如果用監聽線程創建並彈出窗體的話,由於監聽線程一直處於阻塞監聽狀態,沒功夫處理UI方面的東西,所以新彈出的窗口會卡死在那裡。
解決方法:
應該在主UI線程上創建窗體,通過主線程裡面的一個窗體或控件調用Invoke()方法,讓創建和顯示窗體的代碼在主UI線程上執行,
//定義一個委托 MessageEntity是消息實體類 delegate void ShowMessageCallback(MessageEntity message); //委托方法 private void ShowMessageSmall(MessageEntity message) { //右下角消息框Form MessageSmall ms = new MessageSmall(message); ms.Show(); } //調用委托 private void show(MessageEntity message) { //創建委托 ShowMessageCallback wt = new ShowMessageCallback(ShowMessageSmall); //這段代碼在主窗體類裡面寫著,this指主窗體 this.Invoke(wt, new Object[] { message }); }監聽線程監聽到有消息過來後,只需要調用show方法,傳一個消息實體進去就可以通過主UI線程來創建新窗口了。