【问题标题】:C# New Form Creating In A ThreadC# 在线程中创建新表单
【发布时间】:2012-04-30 08:22:14
【问题描述】:

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

我哪里错了?

谢谢。

【问题讨论】:

    标签: c# multithreading forms


    【解决方案1】:

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

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

    【讨论】:

    • -1。事实上错了。我经常看到 - 对不起 - 程序员什么都不知道然后说话。任何线程只要运行一个调度程序就可以打开一个表单,并且创建一个表单是微不足道的。我在这里有一个应用程序,每个“主”窗口有一个线程(有时运行 8 个线程来处理大量数据)。 stackoverflow.com/questions/4698080/… 有示例代码。创建表单方法打开表单,然后运行调度程序。微不足道。
    • @TomTom - 是的,当然其他线程可以是 UI 线程,创建窗口和获取/发送消息。如果他们不能,将只有一个进程:) 在这种情况下,客户端线程将不得不运行一个调度程序来处理消息 - 如果您不必进行阻塞调用,那很好。在 OP 的情况下,我不确定每个客户端运行一个 GUI 线程是否是一个好主意。
    • 我也没有。但这不是重点 - 答案完全错误,表明只有“THE” ui 线程可以创建表单,这意味着它只有一个。
    • @TomTom:我更正了声明。我同意它写得有点粗心。
    【解决方案2】:

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

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

    【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多