如何创建新的Windows窗体,并将其与现有的线程关联?

时间:2008-12-17 13:43:03

标签: c# .net winforms multithreading architecture

我正在尝试用C#编写聊天客户端并遇到问题。

它是如何工作的,客户端每1秒轮询一次服务器以查看是否有任何新动作要采取(例如在频道中显示消息,或其他)。轮询是在自己的线程中完成的。

现在,我希望轮询线程在收到频道打开操作时打开一个新的MDI表单(意味着用户已进入新频道)。问题是,新表单应该在MAIN程序线程上运行,而不是在工作线程上运行。

所以基本上我问,我如何创建一个新的窗体,并将其与现有的线程相关联? (而不是创建它的线程)。

另外,如果您知道更好的方法,请告诉我。我喜欢改进我的程序架构!

全部谢谢

2 个答案:

答案 0 :(得分:4)

使用Control.InvokeControl.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();
    }