Поделиться через


Обработка событий, связанных с процессом, в WebView2

WebView2 использует несколько процессов для поддержки элементов управления WebView2 в приложении. Так как эти процессы могут завершать работу во время использования, WebView2 предоставляет CoreWebView2.ProcessFailed события и CoreWebView2Environment.BrowserProcessExited для реагирования приложения на различные сценарии. Используйте этот документ, чтобы узнать, как использовать эти события для реагирования при возникновении таких сценариев.

Чтобы повысить надежность приложения WebView2, рекомендуется, чтобы приложение обрабатывалось по крайней мере следующими событиями:

Чтобы использовать эту статью, рекомендуется сначала прочитать модель процесса для приложений WebView2. Список API- интерфейсов, связанных с процессом, описанных в этой статье, см. в статье Управление процессами в статье Общие сведения о функциях и API WebView2.

События для процессов, которые завершили работу или завершили сбой

При инициализации элемента управления WebView2 WebView2 обеспечит наличие среды выполнения WebView2 для включения элемента управления и подключения к его группе процессов WebView2. После установки этого подключения элемент управления начнет мониторинг этих процессов и сообщит о следующих событиях, чтобы ваше приложение ранее отреагировало соответствующим образом:

  • Любой сбой процесса. Если какой-либо из процессов в среде выполнения WebView2 завершается сбоем, coreWebView2 вызовет ProcessFailed событие. Это может быть вызвано сбоем процесса или отсутствием ответа на процесс отрисовщика. Используйте это событие для диагностика и восстановления после сбоев в процессах WebView2. См . раздел Обработка сбоев процесса и отрисовка содержимого процесса в элементе управления WebView2 неожиданно завершена ниже.

  • Основной процесс браузера завершается. Если процесс браузера main по какой-либо причине завершается, CoreWebView2Environment объект вызовет BrowserProcessExited событие . Используйте это событие для синхронизации операций с ресурсами и временем существования среды выполнения WebView2, таких как управление папками данных пользователя и обновления. См. раздел Обработка main завершения процесса браузера ниже.

  • Происходит сбой основного процесса браузера. При сбое процесса браузера main создается ProcessFailed событие и BrowserProcessExited событие, так как процесс браузера main завершился из-за сбоя.

Сбор сведений о сбоях процесса

Событие ProcessFailed предоставляет подробные сведения о сбое процесса, о который сообщается. Приложение может использовать и собирать данные из активов событий для мониторинга и диагностика целей, включая описание процесса (только для служебных процессов) и сведения о кадрах (только для процессов отрисовщика).

Некоторые сбои процесса могут вызывать ProcessFailed событие для различных элементов управления WebView2 в приложении. Необходимо решить, как часто собирать сведения и как обрабатывать дубликаты для этих случаев.

Кроме того, большинство сбоев процесса создают дампы в папке данных пользователя в каталоге, возвращенном FailureReportFolderPath. Эти дампы можно использовать для анализа сбоев и предоставления дополнительных сведений при обращении к команде WebView2.

Обработка сбоев процесса

При сбое в среде выполнения WebView2 событие будет возникать для каждого элемента управления WebView2, ProcessFailed связанного с процессом сбоя. Сбой может быть или не может быть восстановлен, а некоторые из них можно восстановить автоматически.

Чтобы определить сбой, можно использовать следующие свойства из аргументов событий:

  • ProcessFailedKind. Сочетание цели процесса (например, браузера, отрисовщика или GPU) и сбоя (выход, отсутствие ответа). Процессы отрисовщика далее делятся на main отрисовщик кадров (RenderProcessExited, RenderProcessUnresponsive) и отрисовщик подкадров (FrameRenderProcessExited).

  • ProcessFailedReason. Указывает категорию проблемы, вызвавшую сбой. Некоторые из этих причин сбоя применимы только к определенным типам сбоев.

Процесс браузера main неожиданно завершился

Все элементы управления WebView2 в приложении, использующие одну и ту же конфигурацию среды, получат событие со следующими параметрами ProcessFailed :

  • Тип сбоя:BrowserProcessExited.
  • Причина сбоя: любая , кроме Unresponsive и LaunchFailed.

Все связанные элементы управления WebView2 будут закрыты, и приложение должно обработать восстановление после этого сбоя. Элементы управления WebView2 необходимо создать заново.

BrowserProcessExited Одно событие будет вызываться из CoreWebview2Environment тоже, но порядок этих событий не гарантируется. Приложение должно координировать свои обработчики событий для этих двух событий при сбое процесса браузера. См. раздел Обработка main завершения процесса браузера ниже.

Процесс отрисовки содержимого в элементе управления WebView2 неожиданно завершился

Содержимое в затронутых кадрах (main или подфрейме) заменяется страницей ошибки. Каждый элемент управления WebView2, на который влияет содержимое, будет получать событие со следующими параметрами ProcessFailed :

  • Тип сбоя:RenderProcessExited или FrameRenderProcessExited.
  • Причина сбоя: любая , кроме Unresponsive и ProfileDeleted.

Приложение должно обрабатывать восстановление после этого сбоя. Если на кадр main влияет (RenderProcessExited), можно использовать API для перезагрузки Reload содержимого в элементах управления. Кроме того, можно воссоздать Close элементы управления WebView2.

Если main кадр не влияет (FrameRenderProcessExited), приложение может взаимодействовать с кадром main для восстановления содержимого в затронутых кадрах. Событие ProcessFailed предоставляет сведения о затронутых кадрах через FrameInfosForFailedProcess свойство .

Процесс GPU неожиданно завершился

Содержимое в элементах управления WebView2 может мигать при автоматическом повторном создании процесса. Каждый элемент управления WebView2 в группе процессов WebView2 будет получать событие со следующими параметрами ProcessFailed :

  • Тип сбоя:GpuProcessExited.
  • Причина сбоя: любая , кроме Unresponsive и ProfileDeleted.

Это наиболее распространенный сбой процесса WebView2, который можно восстановить автоматически. Приложению не требуется обрабатывать восстановление для этого события, но он может собирать сведения, чтобы понять, какие постоянные проблемы или есть основная причина для повторяющегося завершения процесса GPU.

Служебная программа неожиданно завершилась

Могут возникнуть некоторые прерывания (например, если в служебном процессе была размещена аудиослужба), необходимые процессы автоматически создаются заново. Каждый элемент управления WebView2 в группе процессов WebView2 будет получать событие со следующими параметрами ProcessFailed :

  • Тип сбоя:UtilityProcessExited.
  • Причина сбоя: любая , кроме Unresponsive и ProfileDeleted.

Этот сбой процесса не является неустранимым и может быть автоматически восстановлен. Приложению не требуется обрабатывать восстановление для этого события, но он может собирать сведения для понимания любых постоянных проблем, включая ProcessDescription указанные в аргументах событий.

Любой другой процесс неожиданно завершился

Большинство процессов в группе процессов WebView2 связаны со всеми элементами управления WebView2 с его помощью и будут вызываться ProcessFailed к каждому элементу управления с помощью:

  • Тип сбоя:PpapiBrokerProcessExited , PpapiPluginProcessExited, RenderProcessUnresponsiveSandboxHelperProcessExited, или UnknownProcessExited.
  • Причина сбоя: любая , кроме Unresponsive и ProfileDeleted.

Эти сбои процесса не являются неустранимыми, и приложению не требуется обрабатывать восстановление для каких-либо из них, но он может собирать сведения, чтобы понять любые постоянные проблемы.

Обработка отрисовщиков без ответа

Когда процесс отрисовщика для кадра main в элементе управления WebView2 перестает отвечать на входные данные пользователя, ProcessFailed событие будет вызываться следующим образом:

  • Тип сбоя:RenderProcessUnresponsive.
  • Причина сбоя:Unresponsive.

Событие будет по-прежнему вызываться до тех пор, пока процесс не отвечает. Процесс отрисовки может не отвечать на запросы по следующим причинам:

  • Выполняется долго выполняющийся скрипт . Например, веб-содержимое в элементе управления WebView2 может выполнять синхронный XHR или ввести бесконечный цикл. Перезагрузка элемента управления WebView2 (путем вызова Reload) может привести к повторной реакции элемента управления.

  • Система занята.

Это событие будет возникать неоднократно (например, каждые 15 секунд), поэтому необходимо определить пороговое значение для приложения.

Обработка main процесса браузера завершена

Событие BrowserProcessExited указывает на то, что процесс браузера main завершился и его ресурсы (включая его дочерние процессы) были освобождены. Это может произойти по следующим причинам:

  • Все элементы управления WebView2 из CoreWebView2Environment были закрыты. Примеры сценариев приложений:

    • Очистка папки данных пользователя.
    • Обновление среды выполнения WebView2.
    • Перезапуск с другой конфигурацией среды.
    • Очистка кэша проверки подлинности.
  • Сбой процесса браузера main. См. статью Процесс браузера main неожиданно завершился выше.

Это событие предназначено для операций с ресурсами среды выполнения WebView2. Приложение может использовать тип выхода и идентификатор процесса из активов событий, чтобы определить, когда и как обрабатывать событие. Например, может потребоваться согласовать с ProcessFailed обработчиками событий, чтобы предотвратить возникновение условий гонки, которые могут возникнуть при попытке восстановления, а также при попытке удалить папку данных пользователя.

Очистка папки данных пользователя

Приложению необходимо подождать, пока среда выполнения WebView2 не отпустит папку пользовательских данных , прежде чем она сможет удалить ее содержимое. После закрытия всех элементов управления WebView2 событие указывает, BrowserProcessExited что это произошло, и приложение может продолжить операцию.

См. также:

Обновление среды выполнения WebView2

Чтобы использовать последнюю версию среды выполнения WebView2 после обновления, приложению необходимо закрыть все элементы управления WebView2 и создать новый CoreWebView2Environment. Чтобы обеспечить использование новой версии, приложение должно дождаться BrowserProcessExited события. В противном случае процесс браузера main может остаться активным при создании новой среды и переход на новую версию завершится ошибкой.

Перезапуск с другой конфигурацией среды

Большая часть конфигурации, используемой для, привязана CoreWebView2Environment к main времени существования процесса браузера. Чтобы внести изменения в эту конфигурацию (например, в язык), приложению необходимо закрыть существующие элементы управления WebView2 и дождаться BrowserProcessExited повторного создания элементов управления. В противном случае инициализация элементов управления WebView2 из нового CoreWebView2Environment может завершиться сбоем с несовместимой конфигурацией.

Очистка кэша проверки подлинности

В кэше проверки подлинности хранятся выбранные сертификаты и учетные данные из запросов сертификатов клиента HTTPS.

Кэш проверки подлинности привязан к main времени существования процесса браузера. Поэтому для очистки кэша проверки подлинности приложение должно повторно создать свои элементы управления WebView2 из нового экземпляра процесса main браузера.

Чтобы убедиться, что при повторном создании элементов управления WebView2 используется новый экземпляр процесса main браузера, приложение должно дождаться BrowserProcessExited события перед продолжением. В противном случае процесс браузера main может остаться активным при повторном создании элементов управления, что позволит сохранить кэш проверки подлинности, а не очистить его по назначению.

См. также