0

我有一个 TCP 服务器应用程序,并且有一个用于与 TCP 客户端通信的线程。当我从客户端收到数据时,我想使用此数据创建一个新表单,但我无法在线程中创建表单。我可以使用按钮单击事件轻松创建表单。

我哪里错了?

谢谢你。

4

3 回答 3

3

为了避免这种情况,最好让应用程序的原始 UI 线程来处理新表单的创建,而不是有多个 UI 线程。幸运的是,您可以在该线程上调用操作。

请参阅此处了解如何在 WinForms 上执行此操作或在此处在 WPF/Silverlight 中执行此操作。

于 2012-04-30T08:28:45.003 回答
1

完成这项工作的示例代码:

  private void Button1_Click(object sender, EventArgs e)
{
    Thread t1 = new Thread(StartMe);
    t1.Name = "Custom Thread";
    t1.IsBackground = true;
    t1.Start();
}

private void StartMe()
{
    //We are switching to main UI thread.
    TextBox1.Invoke(new InvokeDelegate(InvokeMethod), null); 
}

public void InvokeMethod()
{
    //This function will be on main thread if called by Control.Invoke/Control.BeginInvoke
    MyForm frm = new MyForm();
    frm.Show();
}
于 2012-04-30T08:40:44.473 回答
0

您必须在某处将上下文更改为 GUI 线程以创建新表单 - 在某处,您将需要 BeginInvoke() 一些东西。

这是什么类型的服务器 - 是一个“经典”同步服务器,其中每个客户端连接都有一个侦听线程和一个服务器<>客户端线程?

您不想在客户端连接时创建表单,您只想在连接的客户端特别询问时创建此表单,是吗?

于 2012-04-30T08:35:28.080 回答