自己在寫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線程來創建新窗口了。