2010-12-15 24 views
2

大家好,多种形式,多线程,一个进程

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

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

谢谢!

Chris。

+0

我会使用从同一个线程,而不是每个线程的所有表单。 – CodesInChaos 2010-12-15 10:11:28

回答

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

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