Почему браузер Gecko продолжает работать, даже если окно, в котором он находится, закрыто? - PullRequest
0 голосов
/ 28 марта 2020

У меня есть CreateProjectView, который будет содержать браузер Gecko в одной из своих сеток. Затем я создаю окно с содержимым, равным CreateProjectView и использующим .ShowDialog(). В результате появляется новое диалоговое окно, содержащее CreateProjectView. Но вот проблема, если я выйду из диалога, память все еще остается очень высокой. Я попытался воспроизвести видео на YouTube и закрыл диалоговое окно, но все еще слышал воспроизведение видео.

Я создаю диалог с помощью:

new Window() { Content = new CreateProjectView() { Margin = new Thickness(20,0,20,20) } }.ShowDialog();

Я добавляю браузер Gecko через:

WindowsFormsHost host = new WindowsFormsHost();
host.Child = CreateProjectViewModel.YouTubeBrowser;
YouTubeVideoSelectionGrid.Children.Add(host);                    
CreateProjectViewModel.YouTubeBrowser.Navigate(CreateProjectViewModel.DefaultYouTubeSite);

Вещи, которые я пробовал:

  1. Я попытался добавить событие закрытия в окно и заставить его рыться в содержимом, являющемся представлением, и получать доступ к модели представления. текущий экземпляр браузера Gecko и установка его в null безрезультатно.

  2. Я также попытался удалить браузер, и он работает впервые, но если я пытаюсь создать другой диалог, приложение просто закрывается.

  3. Я попытался удалить Xpcom.Shutdown();, и это решило проблему закрытия приложения из no. 2 и утилизация браузера удалила YouTube видео, которое я слышал. Но что-то не так с памятью процесса из инструментов диагностики. Каждый раз, когда я создаю диалоговое окно, оно добавляет 20-30 МБ и не исчезает, даже если я закрываю диалоговое окно. Если я открою диалоговое окно 10 раз, которое добавляет около 200 МБ +, которое говорит, что не все утилизируется, и мне интересно, что осталось, я даже позвонил System.GC.Collect, но оно все равно не освобождает память.

Где я сейчас нахожусь:

Я пытался лично разместить WindowsFormsHost и GeckoWebBrowser в событии закрытия родительского окна, и пока что происходит:

  1. Видео YouTube, которое я слышал из закрытого диалогового окна, остановилось, поэтому, по крайней мере, я думаю, что браузер отключен.
  2. Также больше не увеличивается использование памяти при открытии следующих диалоговых окон, таких как одно. Из № 3 я испытал то, что попробовал.

Единственное, что не так с этим, это то, что я начал использовать 75 МБ памяти, и после того, как я открыл свой первый диалог, он превращается в 350 Мб, что понятно, так как я встроил браузер НО даже после удаления браузера и winformshost после закрытия окна, использование по-прежнему rem Айнс в 350mb. Если я попытался создать диалоговое окно, содержащее браузер, и использовать его, память все равно останется примерно такой же.

Это все еще далеко от окончательного решения, но, к сожалению, я должен двигаться дальше. Вопрос, однако, все еще очень открыт, и я все же предпочел бы вернуться к 75–100 МБ использования памяти или go к использованию памяти до того, как отобразился первый диалог.

...