自己在写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线程来创建新窗口了。
另外还可参考MSDN文档:
http://msdn.microsoft.com/zh-cn/library/ms171728%28v=vs.80%29.aspx