2016-09-29 115 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