我有一个TCP服务器应用程序,并具有与TCP客户端进行通信的线程。当我从客户端收到数据时,我想通过使用此数据创建新表单,但我无法在一个线程中创建表单。我可以使用按钮点击事件轻松创建表单。C#新窗体在线程中创建
我在哪里错了?
谢谢。
我有一个TCP服务器应用程序,并具有与TCP客户端进行通信的线程。当我从客户端收到数据时,我想通过使用此数据创建新表单,但我无法在一个线程中创建表单。我可以使用按钮点击事件轻松创建表单。C#新窗体在线程中创建
我在哪里错了?
谢谢。
您必须将GUI上下文切换到某个地方以创建新表单 - 某处您需要BeginInvoke()。
这是什么样的服务器 - 是一个'经典'同步服务器,其中每个客户端连接有一个监听线程和一个服务器客户端线程?
您不想在客户端连接时创建表单,您只希望在连接的客户端专门询问时创建此表单,是的?
示例代码来完成这项工作:
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();
}
尝试将VB代码转换为C#。 –
使用http://www.developerfusion.com/tools/convert/vb-to-csharp/将语言转换 –
-1。实际上是错误的。我经常看到 - 抱歉 - 程序员不知道什么,然后说话。任何线程都可以像运行调度程序一样打开窗体,并且创建一个窗体也很简单。我在这里有一个应用程序,每个“主”窗口有一个线程(运行其中的8个有时进行繁重的数据处理)。 http://stackoverflow.com/questions/4698080/spawn-a-new-thread-to-open-a-new-window-and-close-it-from-a-different-thread有示例代码。创建表单方法打开表单,然后运行调度程序。不重要的。 – TomTom
@TomTom - 是的,当然其他线程可以是UI线程,创建窗口和获取/发送消息。如果他们不能,则只有一个进程:)在这种情况下,客户端线程将不得不运行调度程序来处理消息 - 如果不需要进行阻塞调用,那么很好。在OP案例中,我不确定是否为每个客户端运行GUI线程是个好主意。 –
我也没有。但这不是重点 - 答案完全错误,表明只有“The”UI线程才能创建表单,这意味着它只有一个。 – TomTom