【问题标题】:Multiple Forms, Multiple Threads, One Process多表单、多线程、一个进程
【发布时间】:2010-12-15 10:07:07
【问题描述】:

大家好,

我很想知道人们对负责在自己的线程上启动三个单独表单的可执行文件的概念有何看法。这种方法的主要原因是确保表单不能单独运行,这样我们就可以在不使用 IPC 的情况下在表单之间传递信息。

我有点不确定创建与线程相关的表单的理想位置。我假设在他们自己的线程中创建和显示表单会更好。话虽如此,我不确定这是否正常工作。我试过了,但是在表单自己的线程上调用跨线程调用不起作用(即 BeginInvoke 调用不会让它回到另一个线程上的 ShowWindow 方法)...

    private void ShowWindow(string serialNumber)
    {
        if (this.InvokeRequired)
        {
            this.BeginInvoke((MethodInvoker)(delegate() { ShowWindow(serialNumber); }));
        }
        else
        {
            this.Visible = true;
            this.WindowState = FormWindowState.Normal;
            if (serialNumber != string.Empty)
            {
                knavManagement.SelectedPage = knpActivate;
                activatePage.SerialNumber = serialNumber;
            }
            Application.DoEvents();
        }
    }

我尝试了许多不同的方法在它自己的线程上调用该方法,但它们都不起作用,这让我认为这可能与底层线程系统有关,因此我提出了问题。

谢谢!

克里斯。

【问题讨论】:

  • 我会使用同一个线程中的所有表单,而不是每个线程。

标签: c# winforms multithreading


【解决方案1】:

Windows 窗体必须全部由主 UI 线程创建。您可以让每个表单生成一个工作线程来执行需要完成的工作。工作线程可以在没有 IPC 的情况下相互通信,尽管您现在处于必须同步线程间通信的位置。

【讨论】:

    【解决方案2】:

    感谢你们到目前为止的 cmets。

    我发现似乎可行的一种方法是在每个表单上使用 Application.Run,​​我相信这会在其自己的 UI 线程上启动表单。我不太确定这会带来什么影响,我会报告回来...

        public void StartManagementConsole()
        {            
            ThreadStart start = delegate
            {
                _managementConsole = new ManagementConsole();
                Application.Run(_managementConsole);
            };
    
            consoleThread = new Thread(start);
            consoleThread.SetApartmentState(ApartmentState.STA);
            consoleThread.Start();
        }
    

    【讨论】:

      猜你喜欢
      • 2021-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-12
      • 1970-01-01
      相关资源
      最近更新 更多