Как обойти утечку памяти в элементе управления .NET Webbrowser?

Это широко известная старая проблема с элементом управления .NET Webbrowser.

Резюме: Наличие элемента управления веб-браузером .NET «Переход на страницу» увеличивает использование памяти, которая никогда не освобождается.

Воспроизведите утечку памяти: добавьте в форму элемент управления WebBrowser. Используйте его для перехода на любые страницы, которые вам нужны. about: blank работает, прокрутка изображений Google вниз до тех пор, пока ваше использование не станет более 100 МБ, а затем просмотр в другом месте, чтобы заметить, что почти вся память не освобождена, - более яркая демонстрация.

Мои текущие требования к приложению включают запуск его в течение длительного времени с отображением ограниченного окна браузера IE7. Запуск самого IE7 с какой-то ублюдочной настройкой хуков, BHO и групповых политик тоже нежелателен, хотя в настоящее время это выглядит как запасной вариант. Встраивание браузера в приложение Windows Forms - это. Я не могу использовать другой браузер. Требуется IE7.

Предыдущие темы и статьи, относящиеся к этой известной утечке памяти:

Часто предлагаемые исправления, которые НЕ РАБОТАЮТ:

  • Переход к другим страницам не имеет значения. about: blank вызывает утечку. Для этого не требуется, чтобы на странице был javascript или какие-либо другие дополнительные технологии.
  • Использование разных версий Internet Explorer не имеет значения. 7, 8 и 9 демонстрируют одни и те же симптомы, и, насколько я слышал, все версии имеют одинаковую утечку памяти в элементе управления.
  • Dispose () элемента управления не помогает.
  • Сбор мусора не помогает. (Фактически, проведенное мной исследование показывает, что утечка происходит в неуправляемом коде COM, который оборачивается элементом управления Webbrowswer.)
  • Минимизация и установка доступной памяти процесса на -1, -1 (SetProcessWorkingSetSize () или аналогично.) снижает использование физической памяти, не влияет на виртуальную память.
  • Вызов WebBrowser.Stop () не является решением и нарушает функциональность использования чего-либо, кроме статических веб-страниц, не делая больше, чем просто минимизируя утечку.
  • Принудительное ожидание полной загрузки документа перед переходом к другому также не помогает.
  • Загрузка элемента управления в отдельный домен приложения не решает проблему. (Я сам этого не делал, но исследования показывают, что другие не добились успеха с этим маршрутом.)
  • Использование другой оболочки, такой как csexwb2, не помогает, поскольку при этом также возникает та же проблема.
  • Очистка кеша временных файлов Интернета ничего не делает. Проблема в активной памяти, а не на диске.

Память очищается при закрытии и перезапуске всего приложения.

Я готов написать собственный элемент управления браузером напрямую в COM или Windows API, если это наверняка решит проблему. Конечно, я бы предпочел менее сложное исправление; Я бы предпочел не спускаться на более низкие уровни, чтобы что-то сделать, потому что я не хочу изобретать колесо с точки зрения поддерживаемых функций браузера. Избавьтесь от дублирования функций IE7 и нестандартного поведения в браузере с индивидуальным дизайном.

Помощь?

57
задан Community 23 May 2017 в 11:47
поделиться