Это широко известная старая проблема с элементом управления .NET Webbrowser.
Описание: Наличие элемента управления веб-браузера .NET «Переход на страницу» увеличивает использование памяти, которая никогда не освобождается.
Воспроизведите утечку памяти: добавьте в форму элемент управления WebBrowser. Используйте его для перехода к любым нужным страницам. about: blank работает, прокрутка изображений Google вниз до тех пор, пока ваше использование не станет более 100 МБ, а затем просмотр в другом месте, чтобы заметить, что почти вся память не освобождена, - более яркая демонстрация.
Мои текущие требования к приложению включают запуск его в течение длительного времени с отображением ограниченного окна браузера IE7. Запуск самого IE7 с какой-то ублюдочной настройкой хуков, BHO и групповых политик тоже нежелателен, хотя в настоящее время это выглядит как запасной вариант. Встраивание браузера в приложение Windows Forms - это. Я не могу использовать другую базу браузера. Требуется IE7.
Предыдущие темы и статьи, относящиеся к этой известной утечке памяти:
- http://www.vbforums.com/showthread.php?t=644658
- Как исправить утечку памяти в IE WebBrowser Control? < / а>
- Утечка памяти при использовании элемента управления WPF WebBrowser в нескольких окнах а>
- http://social.msdn.microsoft.com/Forums/en-US/ieextensiondevelopment/thread/88c21427-e765-46e8-833d-6021ef79e0c8/
- http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/8a2efea4-5e75-4e3d-856f-b09a4e215ede
- http://dotnetforum.net/topic/17400-appdomain-webbrowser-memory-leak/
Часто предлагаемые исправления, которые НЕ РАБОТАЮТ:
- Переход на разные страницы не имеет значения. about: blank вызывает утечку. Для этого не требуется, чтобы на странице был javascript или какие-либо другие дополнительные технологии.
- Использование разных версий Internet Explorer не имеет значения. 7, 8 и 9 демонстрируют одни и те же симптомы, и, насколько я слышал, все версии имеют одинаковую утечку памяти в элементе управления.
- Dispose () элемента управления не помогает.
- Сбор мусора не помогает. (Фактически, проведенное мной исследование показывает, что утечка происходит в неуправляемом COM-коде, который оборачивается элементом управления Webbrowswer.)
- Сведение к минимуму и установка доступной памяти процесса на -1, -1 (SetProcessWorkingSetSize () или аналог.) Только сокращает использование физической памяти, не влияет на виртуальную память.
- Вызов WebBrowser.Stop () не является решением и нарушает функциональность использования чего-либо, кроме статических веб-страниц, не делая больше, чем просто минимизируя утечку.
- Принудительное ожидание полной загрузки документа перед переходом к другому также не помогает.
- Загрузка элемента управления в отдельный домен приложения не решает проблему. (Сам я этого не делал, но исследования показывают, что другие не добились успеха с этим путем.)
- Использование другой оболочки, такой как csexwb2, не помогает, поскольку она также страдает той же проблемой.
- Очистка кеша временных файлов Интернета ничего не делает. Проблема в активной памяти, а не на диске.
Память очищается при закрытии и перезапуске всего приложения.
Я готов написать собственный элемент управления браузером напрямую в COM или Windows API, если это наверняка решит проблему. Конечно, я бы предпочел менее сложное исправление; Я бы предпочел не спускаться на более низкие уровни, чтобы что-то сделать, потому что я не хочу изобретать колесо с точки зрения поддерживаемых функций браузера. Избавьтесь от дублирования функций IE7 и нестандартного поведения в браузере с индивидуальным дизайном.
Помощь?