2012-01-23 3 views
1

버튼을 클릭하면 컨트롤을로드하는 새 창 (BrowserWindow)이 인스턴스화되는 WPF 앱이 있습니다. 창은 이와 같은 두 번째 스레드에서 시작됩니다.별도의 창 스레드 닫기

private void BrowserThreadStart(BrowserWindow browser, String address) 
{ 
    browser = new BrowserWindow(); 
    browser.LoadPage(address); 
    browser.Show(); 
    System.Windows.Threading.Dispatcher.Run(); 
} 

private void Press(object sender, MouseButtonEventArgs e) 
{ 
    Thread mainBrowserThread = new Thread(() => BrowserThreadStart(myBrowser, "http://www.google.com")); 
    mainBrowserThread.SetApartmentState(ApartmentState.STA); 
    mainBrowserThread.IsBackground = true; 
    mainBrowserThread.Start(); 
} 

대단히 훌륭합니다.

이에 따라 MainWindow을 프로그램 방식으로 숨기거나 닫는 별도의 스레드에서 BrowserWindow 인스턴스를 숨기거나 닫는 적절한 방법은 무엇입니까?

가 나는 BrowserWindow myBrowser 내가 그것을 위로 두 번째 스레드에서 실행을 볼 수 있지만 (null 인 (MainWindow를에서) 내 주 스레드에서 나타났습니다.

답변

2

당신은 BrowserThreadStart 수정을 의미 "값에 의해 전달"하는 참조가 아닌 참조의 사본. BrowserThreadStart 메소드 선언 및 메소드 호출에서 브라우저에 ref or out을 추가해야합니다. 다음은 필요 및 환경 설정에 따라 ref로 대체 할 수있는 예제입니다.

변경 시도 :

private void BrowserThreadStart(BrowserWindow browser, String address) 

private void BrowserThreadStart(out BrowserWindow browser, String address) 

Thread mainBrowserThread = new Thread(() => BrowserThreadStart(myBrowser, "http://www.google.com")); 

Thread mainBrowserThread = new Thread(() => BrowserThreadStart(out myBrowser, "http://www.google.com")); 
+0

감사합니다. 나는 이것을 시도 할 것이다. 주제 질문에서 다소 벗어 났지만 "() =>"구문에 대한 용어가 있습니다. 전에는 그런 것을 본 적이 없으며 어떤 순서로 어떤 운영자/작업이 진행되고 있는지 해독하려고합니다. – Ternary

+0

@Ternary, [lambda expression]이라고합니다 (http://msdn.microsoft.com/en-us/library/bb397687.aspx). – David