我正在尝试用C#编写聊天客户端并遇到问题。
它是如何工作的,客户端每1秒轮询一次服务器以查看是否有任何新动作要采取(例如在频道中显示消息,或其他)。轮询是在自己的线程中完成的。
现在,我希望轮询线程在收到频道打开操作时打开一个新的MDI表单(意味着用户已进入新频道)。问题是,新表单应该在MAIN程序线程上运行,而不是在工作线程上运行。
所以基本上我问,我如何创建一个新的窗体,并将其与现有的线程相关联? (而不是创建它的线程)。
另外,如果您知道更好的方法,请告诉我。我喜欢改进我的程序架构!
全部谢谢
答案 0 :(得分:4)
使用Control.Invoke或Control.BeginInvoke使轮询线程回调到主表单,并在回调中创建表单。
我假设您已经在使用Invoke / BeginInvoke来更新UI - 这只是另一种UI操作。
答案 1 :(得分:0)
您应该从主窗口调用该功能:
void MyWorkerThread() {
while (Connected) {
Thread.Sleep(1000);
if (NewMessage) {
ShowNewForm();
}
}
}
void ShowNewForm() {
if (this.InvokeRequired) { // this refers to the current form
this.Invoke(new Action(ShowNewForm)); // this line invokes the same function on the same thread as the current form
return;
}
Form myMdiForm = new Form();
myMdiForm.Show();
}