2012-04-30 88 views
0

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

我在哪里错了?

谢谢。

回答

4

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

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

+1

-1。实际上是错误的。我经常看到 - 抱歉 - 程序员不知道什么,然后说话。任何线程都可以像运行调度程序一样打开窗体,并且创建一个窗体也很简单。我在这里有一个应用程序,每个“主”窗口有一个线程(运行其中的8个有时进行繁重的数据处理)。 http://stackoverflow.com/questions/4698080/spawn-a-new-thread-to-open-a-new-window-and-close-it-from-a-different-thread有示例代码。创建表单方法打开表单,然后运行调度程序。不重要的。 – TomTom

+0

@TomTom - 是的,当然其他线程可以是UI线程,创建窗口和获取/发送消息。如果他们不能,则只有一个进程:)在这种情况下,客户端线程将不得不运行调度程序来处理消息 - 如果不需要进行阻塞调用,那么很好。在OP案例中,我不确定是否为每个客户端运行GUI线程是个好主意。 –

+0

我也没有。但这不是重点 - 答案完全错误,表明只有“The”UI线程才能创建表单,这意味着它只有一个。 – TomTom

0

您必须将GUI上下文切换到某个地方以创建新表单 - 某处您需要BeginInvoke()。

这是什么样的服务器 - 是一个'经典'同步服务器,其中每个客户端连接有一个监听线程和一个服务器客户端线程?

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

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(); 
} 
+0

尝试将VB代码转换为C#。 –

+0

使用http://www.developerfusion.com/tools/convert/vb-to-csharp/将语言转换 –

相关问题