单独的窗口线程关闭

时间:2012-01-23 23:02:23

标签: c# wpf multithreading thread-safety

我有一个WPF应用程序,当单击一个按钮时,将实例化一个新窗口(BrowserWindow),以加载全屏WebBrowser控件。 Window就是在这样的第二个线程上开始的。

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实例的正确方法是什么?

我注意到我的主线程(在MainWindow中),BrowserWindow myBrowser为空(即使我可以看到它并在第二个线程上运行。

1 个答案:

答案 0 :(得分: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"));