多个表单,多个线程,一个进程

时间:2010-12-15 10:07:07

标签: c# winforms multithreading

大家好,

我有兴趣知道人们对可执行文件概念的看法,该可执行文件负责在自己的线程上启动三个单独的表单。这种方法的主要原因是确保表单不能单独运行,以便我们可以在不使用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();
        }
    }

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

三江源!

克里斯。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

感谢您对目前为止的评论。

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