2016-09-29 6 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) 스레드에서 실행되어야합니다. 그것이 규칙입니다. 다른 스레드를 사용할 필요가 없으며 사용하지 않아야합니다. 따라서 클릭 이벤트 핸들러에서 다른 스레드를 사용하지 않고 다음을 작성하십시오. new Child(). Show();

+0

'Child'는 일회용이므로'new Child(). Show()'를 쓰지 마십시오. 이 방법으로 메모리 누수가 발생했습니다. – Enigmativity

+0

그러면 솔루션은 무엇입니까? –

+1

@Enigmativity 누출되지 않습니다. 양식은 Application.OpenForms 컬렉션에 추가되며 사용자가 주 양식을 닫을 때 사용자 또는 프로그램이 처리합니다. – LarsTech

관련 문제