2011-04-06 2 views
4

별도의 스레드에서 창을 여는 방법은 무엇입니까?

Window newWindow = new Window(); 
newWindow.Show(); 

while (true) 
{ 
    Console.Write("spin"); 
} 

즉, 기본 창에서 집중적 인 계산을 수행하고 있지만이 새 창 (애니메이션이있는 표시기를 표시하려고하는 곳)이 응답하지 않습니다. (그것은 냉동이야 ...)

그래서 내가하려고 :

Thread thread = new Thread(() => 
{ 
    Window newWindow = new Window(); 
    newWindow.Show(); 
}); 

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

while (true) 
{ 
    Console.Write("spin"); 
} 

하지만 새 창이 여전히 동결 등 누구나 여기에 무엇이 잘못 알고 있니?

+1

왜 다른 스레드에서 작업을 수행하지 않습니까? –

답변

8

자신의 스레드에서 새 창을 열려고 시도해서는 안됩니다.

대신, 수행중인 계산 작업을 백그라운드 스레드로 푸시하고 UI 스레드를 그대로 둡니다. 가장 간단한 방법은 일반적으로 BackgroundWorker을 사용하는 것입니다. UI 스레드에 자동으로 진행 및 완료의 마샬링을 처리합니다.

그러나 직접 또는 Task/Task<T> 스레드를 사용하여이 작업을 수행 할 수 있습니다. progress notifcication과 같이 UI를 업데이트 할 내용에 대해서는 UI 컨텍스트에서 만든 Dispatcher 또는 TaskScheduler를 사용해야합니다.

+0

"계산 작업"은 실제로 newWindow 이외에도 표시되는 새 창입니다. 로드하는 데 시간이 걸리는 새 창을로드하고 있습니다. – foreyez

+1

@foreyez : 일반적으로 "새 창"에서 비 UI 계산을 백그라운드 스레드로 옮기고이 문제를 완전히 피할 수 있습니다. –

+0

나는 그가 새 스레드에서 창을 새로 작성하거나로드하는 방법을 사용하도록 권장하고 있다고 생각합니다. 그러면 창이 열리 며 로딩 메시지가 표시됩니다 (로드 이벤트 인 경우) – Mike

2

GUI 스레드가 하나뿐입니다. 차단 작업을해야하는 경우 해당 항목은 백그라운드 스레드에 있어야합니다.

2

Application 클래스를 사용하여 새 스레드에서 별도의 메시지 루프를 실행해야합니다.

+1

정답, 나쁜 조언. –

+0

@Henk : 예; 나는 그것이 나쁜 충고임을 깨닫는다. 그러나 다른 답변은 이미 그것을 다뤘습니다. – SLaks

1

@ 슬래시 콘솔 앱에서 새 창을 시작하려는 경우 매우 유용 할 수 있습니다. 한 가지 방법은 showDialog();을 사용하는 것입니다.

당신이 다음 Show() 등을 사용하는 경우는 Application.run() 당신이 메인 콘솔 스레드에서 Application.Exit()를 호출 할 때

(이 너트와 새 메시지 루프를 시작하려면 응용 프로그램 클래스를 사용하여 볼트입니다), 다음 응용 프로그램이 실제로 종료 ;

showDialog()을 사용하는 경우 스레드를 중단하고 창이 마우스 위로 또는 포커스를 맞출 때까지 기다려야합니다. 그렇지 않으면 영원히 종료 될 것입니다.

관련 문제