2016-09-29 71 views
0

我有一個應用程序,其中多個子窗體是從父窗體生成的,使用單個子窗體定義(即frmParent生成frmChild的多個實例)。父窗體關閉時如何關閉在自己的線程中運行的子窗體? (非MDI)

每個孩子都在自己的線程中運行 - 我希望能夠獨立地與每個孩子交互(並且我不喜歡MDI)。

所以 - 如果父窗體關閉,我該如何指導孩子窗體關閉自己?

 private void btn1_Click(object sender, EventArgs e) 
    { 
     Thread thread = new Thread(delegate() 
     { 
      using (Child child = new Child()) 
      { 
       child.MyName = "1"; 
       child.ShowDialog(); 
      } 
     }); 
     thread.SetApartmentState(ApartmentState.STA); 
     thread.Start(); 
    } 

    private void btn2_Click(object sender, EventArgs e) 
    { 
     Thread thread = new Thread(delegate() 
     { 
      using (Child child = new Child()) 
      { 
       child.MyName = "2"; 
       child.ShowDialog(); 
      } 
     }); 
     thread.SetApartmentState(ApartmentState.STA); 
     thread.Start(); 
    } 
+4

所有UI組件應該只在一個線程上運行:主(UI)線程。這是規則。 –

+1

你確定他們在自己的線程?通常只有一個UI線程。你如何展示他們? –

+0

那麼如果不使用多線程,如果您不想使用MDI,那麼如何獲得獨立運行的多個表單? –

回答

2

作爲基於評論的結論,所有UI組件應該只在一個線程上運行:主線程(UI)。這是規則。你不需要/不應該使用另一個線程。因此,如果不在click事件處理程序中使用另一個線程,只需編寫:new Child().Show();

+0

不要把'new Child()。Show()'寫成'Child'是一次性的。這是一種內存泄漏。 – Enigmativity

+0

那麼,解決方案是什麼? –

+1

@Enigmativity不泄漏。表單將被添加到Application.OpenForms集合中,並在用戶關閉主窗體時由用戶或程序處理。 – LarsTech