2014-11-25 23 views
0

인스턴스를 생성하고 창을 표시하려고했을 때 {"The calling thread must be STA, because many UI components require this."}이라는 예외가 생겼으므로 다음과 같이 분리 된 STA 스레드에서 모두 다시 처리했습니다.창은 sepatarted 스레드에서 생성되고 표시되는 즉시 닫힙니다.

var thread = new Thread(() => 
{ 
    notificationPopUp = new NotificationPopUpView(unreadNotifications.First().session_s,unreadNotifications.First().secondry_msg); 
    notificationPopUp.Show(); 
}); 

thread.SetApartmentState(ApartmentState.STA); 
thread.Start(); 

이제 창이 표시되어 즉시 사라집니다. 스레드가 작업을 종료 한 것은 내 선언 된 개체보다 너무 빠르다 고 생각합니다. 올바른 경우, 어떻게 처리해야합니까? 많은 다른 방법 (필사적으로) 전에 소유자 메서드 전에 Main 메서드 전에 [STAThread] 특성을 넣어이 솔루션을 피하기 위해 노력했지만 같은 문제가 계속, 나는 kn 아, 질문의 제목이 어떻게 든 잘 설명되지는 않지만,이 STA에 대해 언급해야 할 의무가 있습니다. 전체 데이터를 제공하기 위해 사용했던 오류가 있습니다.

enter image description here

그래서 내 기본 질문은 : 왜 창을 즉시 닫고 있습니까?

이제는 스레드에서 만들어졌고 스레드가 작업을 마친 후에 처리 되었기 때문에 STA 스레드 호출자를 존중해야한다는 것을 알고 있어야합니까? 미리 감사드립니다.

+0

, 당신은 여러 번에게 그 답했다고 – thumbmunkeys

+0

@thumbmunkeys를 찾을 수 그래서 그 질문에 대한 답변을 이해합니다. 그래서 저는 SO와 Google에서 최선을 다해 검색해 보았습니다. 초보자라고 생각하고, 여기에 질문을 게시하는 것이 유일한 피난처였습니다. 내가 당신, 그 모든 것을 이해하고 문제를 해결하도록 도와 주시겠습니까? 모든 경우에 ... – AymenDaoudi

답변

1

글쎄, 새 스레드에서 창을 만들었고 스레드가 종료 된 다음 누가 message loop을 실행할 것입니까?

사용자 개체 (Window, Form, Control)를 만든 스레드는 운영 체제에서 보낸 메시지에 응답하기 위해 메시지 루프를 실행해야합니다.

Dispatcher.Run을 호출하여 메시지 루프를 실행하십시오. '나도 알아,하지만 난 내 특정한 경우를 대상으로 한 보장 할 수 없습니다, 그래서 didn를 : 당신이 SO에이 오류 메시지를 검색 할 경우

var thread = new Thread(() => 
{ 
    notificationPopUp = new NotificationPopUpView(unreadNotifications.First().session_s,unreadNotifications.First().secondry_msg); 
    notificationPopUp.Show(); 
    Dispatcher.Run(); 
}); 
thread.SetApartmentState(ApartmentState.STA); 
thread.IsBackground = true; 
thread.Start();