【问题标题】:Separate Window Thread Closure单独的窗口线程关闭
【发布时间】:2012-01-23 23:02:22
【问题描述】:

我有一个 WPF 应用程序,当单击按钮时,会实例化一个新窗口 (BrowserWindow) 来加载全屏 WebBrowser 控件。像这样在第二个线程上启动窗口。

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 为空(尽管我可以看到它在第二个线程上启动并运行。

【问题讨论】:

    标签: c# wpf multithreading thread-safety


    【解决方案1】:

    您是“按值传递”,这意味着 BrowserThreadStart 是修改引用的副本而不是引用。您需要在 BrowserThreadStart 方法声明和方法调用中将ref or out 添加到浏览器。这是一个示例,您可以根据需要和偏好将 ref 替换为 out。

    尝试改变:

    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"));   
    

    【讨论】:

    • 谢谢。我会试试这个。有点离题的问题,但是否有“()=>”语法的术语。以前从未见过这样的事情,我正试图破译哪些操作员/操作以什么顺序发生。
    • @Ternary,它被称为lambda expression
    猜你喜欢
    • 1970-01-01
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 2020-10-06
    相关资源
    最近更新 更多