Отдельное закрытие нити - PullRequest
1 голос
/ 24 января 2012

У меня есть приложение 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 равен нулю (хотя я вижу, что он запущен во втором потоке.

1 Ответ

2 голосов
/ 24 января 2012

Вы «передаете по значению», что означает, что BrowserThreadStart изменяет копию ссылки, а не ссылки. Вам нужно добавить ref или в браузер в объявлении метода BrowserThreadStart и вызове метода. Вот пример, который вы можете заменить 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"));   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...