C#在线程中创建新表单

时间:2012-04-30 08:22:15

标签: c# multithreading forms

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

我哪里错了?

谢谢。

3 个答案:

答案 0 :(得分:3)

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

请参阅here有关如何在WinForms上执行此操作或here在WPF / Silverlight中执行此操作。

答案 1 :(得分: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();
}

答案 2 :(得分:0)

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

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

您不希望在客户端连接时创建表单,您只想在连接的客户端专门询问时创建此表单,是吗?