【问题标题】:New form on a different thread不同线程上的新表单
【发布时间】:2023-03-10 18:18:01
【问题描述】:

所以我的应用程序中有一个线程,其目的是监听来自服务器的消息并根据它收到的内容采取行动。

当我想从服务器触发消息时遇到了一个问题,即当客户端应用程序收到它时,客户端应用程序会打开一个新表单。然而,这种新形式会立即冻结。

我认为正在发生的事情是新表单加载到与侦听服务器的线程相同的线程上,这当然是忙于侦听流,进而阻塞了线程。

通常,对于客户端侦听线程中的其他函数,我会使用调用来更新主窗体的 UI,所以我想我要问的是,如果这是一种在主窗体。

【问题讨论】:

    标签: c# winforms multithreading invoke


    【解决方案1】:

    您基本上自己给出了答案 - 只需使用 Invoke 执行代码以在 GUI 线程上创建表单。

    【讨论】:

      【解决方案2】:

      我假设这是 Windows 窗体而不是 WPF?从您的后台线程中,您不应尝试创建任何表单、控件等或操作它们。这仅适用于运行消息循环并可以处理 Windows 消息的主线程。

      所以要让你的代码在主线程而不是后台线程上执行,你可以像这样使用 Control.BeginInvoke 方法:

      private static Form MainForm; // set this to your main form
      
      private void SomethingOnBackgroundThread() {
      
          string someData = "some data";
      
          MainForm.BeginInvoke((Action)delegate {
      
              var form = new MyForm();
              form.Text = someData;
              form.Show();
      
          });
      }
      

      要记住的主要一点是,如果后台线程不需要来自主线程的任何响应,则应该使用 BeginInvoke,而不是 Invoke。否则,如果主线程忙于等待后台线程,您可能会陷入死锁。

      【讨论】:

      • 这是一个好主意,也是一个很好的解决方案,但是如果还没有创建主窗体怎么办?就像您想从任何线程在主线程上创建一个表单一样,但不保证有一个活动的主表单。在这种情况下有没有可以使用的解决方案?
      猜你喜欢
      • 2011-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-23
      • 1970-01-01
      相关资源
      最近更新 更多