我有一个TCP服务器应用程序,并有一个与TCP客户端通信的线程。当我从客户端收到数据时,我想通过使用此数据创建新表单,但我无法在线程中创建表单。我可以使用按钮点击事件轻松创建表单。
我哪里错了?
谢谢。
答案 0 :(得分:3)
为了避免这种情况,最好让应用程序原始UI线程处理新表单的创建而不是多个UI线程。幸运的是,您可以在该线程上调用操作。
答案 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()某些内容。
这是什么类型的服务器 - 是一个“经典”同步服务器,其中每个客户端连接都有一个监听线程和一个服务器<>客户端线程?
您不希望在客户端连接时创建表单,您只想在连接的客户端专门询问时创建此表单,是吗?