C# 多表单、多线程、一个进程

C# 多表单、多线程、一个进程,c#,winforms,multithreading,C#,Winforms,Multithreading,大家好, 我想知道人们对负责在他们自己的线程上启动三个单独表单的可执行文件的概念有什么看法。这种方法的主要原因是确保表单不能单独运行,这样我们就可以在表单之间传递信息,而无需使用IPC 我有点不确定理想的地方,以创造他们的线程方面的形式。我假设最好在自己的线程中创建和显示表单。话虽如此,我不确定这是否正确。我试过了,但在窗体自己的线程上调用跨线程调用不起作用(即,BeginInvoke调用无法返回到另一个线程上的ShowWindow方法) 我尝试了许多不同的方法在自己的线程上调用该方法,但没有一

大家好,

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

我有点不确定理想的地方,以创造他们的线程方面的形式。我假设最好在自己的线程中创建和显示表单。话虽如此,我不确定这是否正确。我试过了,但在窗体自己的线程上调用跨线程调用不起作用(即,BeginInvoke调用无法返回到另一个线程上的ShowWindow方法)

我尝试了许多不同的方法在自己的线程上调用该方法,但没有一种有效,这导致我认为它可能与底层线程系统有关,因此我提出了这个问题

谢谢


克里斯。

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

感谢您的评论

我发现一种似乎有效的方法是在每个表单上使用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();
    }

我会使用同一条线的所有形式,而不是每一条线。
    public void StartManagementConsole()
    {            
        ThreadStart start = delegate
        {
            _managementConsole = new ManagementConsole();
            Application.Run(_managementConsole);
        };

        consoleThread = new Thread(start);
        consoleThread.SetApartmentState(ApartmentState.STA);
        consoleThread.Start();
    }