在 WebView2 中处理与进程相关的事件

WebView2 使用多个进程来支持应用程序中的 WebView2 控件。 由于这些进程可以在使用过程中退出,因此 WebView2 为应用程序提供了 CoreWebView2.ProcessFailedCoreWebView2Environment.BrowserProcessExited 事件,以便对不同的方案做出反应。 使用此文档了解如何使用这些事件在发生这些方案时做出反应。

若要提高 WebView2 应用程序的可靠性,建议应用至少处理以下事件:

若要使用本文,建议首先阅读 WebView2 应用的进程模型。 有关本文介绍的进程相关 API 的列表,请参阅 WebView2 功能和 API 概述中的进程管理

退出或失败的进程的事件

初始化 WebView2 控件时,WebView2 将确保有一个 WebView2 运行时来为控件提供支持并连接到其 WebView2 进程组。 建立此连接后,控件将开始监视这些进程并报告以下事件,以便应用程序可以做出相应的反应:

  • 任何进程失败。 当 WebView2 运行时中的任何 进程 失败时,CoreWebView2 将引发 事件 ProcessFailed 。 这可能是由于进程崩溃或呈现器进程无响应。 使用此事件进行诊断并从 WebView2 进程中的故障中恢复。 请参阅下面的 处理进程崩溃WebView2 控件中的进程呈现内容意外退出

  • 主浏览器进程退出。 如果主浏览器进程 出于任何原因退出, CoreWebView2Environment 将引发 事件 BrowserProcessExited 。 使用此事件可同步涉及 WebView2 运行时资源和生存期的操作,例如 用户数据文件夹 管理和更新。 请参阅下面的 处理主浏览器进程退出

  • 主浏览器进程崩溃。 当主浏览器进程崩溃时,它将同时生成事件 ProcessFailedBrowserProcessExited 事件,因为主浏览器进程由于失败 而退出

收集进程失败详细信息

ProcessFailed 事件提供有关所报告的进程失败的详细信息。 应用程序可以使用和收集来自事件参数的信息进行监视和诊断,包括仅) 呈现器进程的) 和帧信息 ( (实用工具进程的进程说明 (信息。

某些进程失败可能会在应用程序中的不同 WebView2 控件之间引发 ProcessFailed 事件。 必须决定收集详细信息的频率以及如何处理这些情况的重复项。

此外,大多数进程崩溃都会在 用户数据文件夹中FailureReportFolderPath返回的目录下生成转储。 在联系 WebView2 团队时,可以使用这些转储了解崩溃并提供其他信息。

处理进程崩溃

当 WebView2 运行时发生崩溃时, ProcessFailed 将为与崩溃进程关联的每个 WebView2 控件引发事件。 故障可能是可恢复的,也可能是无法恢复的,某些故障是可自动恢复的。

可以使用事件参数中的以下属性来标识失败:

  • ProcessFailedKind. 进程用途 ((例如浏览器、呈现器或 GPU) )和故障 (退出、无响应) 的组合。 呈现器进程进一步划分为 主帧 呈现器 (RenderProcessExitedRenderProcessUnresponsive) 和 子帧 呈现器 (FrameRenderProcessExited) 。

  • ProcessFailedReason. 指示导致失败的问题类别。 其中一些 失败原因 仅适用于特定的 故障类型

主浏览器进程意外退出

使用相同环境配置的应用程序中的所有 WebView2 控件将接收事件: ProcessFailed

  • 故障类型:BrowserProcessExited
  • 失败原因:任何,但 和 LaunchFailed除外Unresponsive

所有关联的 WebView2 控件都将关闭,并且应用程序 必须处理 此故障的恢复。 需要重新创建 WebView2 控件。

也会从 CoreWebview2Environment 引发单个BrowserProcessExited事件,但不能保证这些事件的顺序。 当浏览器进程崩溃时,应用程序必须协调这两个事件的事件处理程序。 请参阅下面的 处理主浏览器进程退出

WebView2 控件中呈现内容的进程意外退出

受影响的帧 (主帧或子帧) 中的内容将替换为错误页。 每个影响内容的 WebView2 控件都将接收事件, ProcessFailed 其中包含:

  • 故障类型:RenderProcessExitedFrameRenderProcessExited
  • 失败原因:任何,但 和 ProfileDeleted除外Unresponsive

应用程序 必须处理 此故障的恢复。 如果主帧 () RenderProcessExited 受到影响,则可以使用 Reload API 重新加载控件中的内容。 或者,可以 Close 重新创建 WebView2 控件。

如果主帧 (FrameRenderProcessExited) 不受影响,则应用程序可以与主帧通信以恢复受影响帧中的内容。 事件 ProcessFailed 通过 FrameInfosForFailedProcess 属性提供受影响帧的详细信息。

GPU 进程意外退出

WebView2 控件中的内容可能会在自动重新创建进程时闪烁。 WebView2 进程组中的每个 WebView2 控件都将接收事件,ProcessFailed其中包含:

  • 故障类型:GpuProcessExited
  • 失败原因:任何,但 和 ProfileDeleted除外Unresponsive

这是最常见的 WebView2 进程故障,可自动恢复。 应用程序 不需要 处理此事件的恢复,但可以收集信息来了解任何持久性问题,或者是否有导致重复 GPU 进程退出的根本原因。

实用工具进程意外退出

例如,如果实用工具进程承载音频服务,) 自动重新创建必要的进程,则可能存在一些中断 (。 WebView2 进程组中的每个 WebView2 控件都将接收事件,ProcessFailed其中包含:

  • 故障类型:UtilityProcessExited
  • 失败原因:任何,但 和 ProfileDeleted除外Unresponsive

此过程失败不是致命的,可自动恢复。 应用程序 不需要 处理此事件的恢复,但可以收集信息来了解任何持久性问题,包括 ProcessDescription 事件参数中提供的 。

任何其他进程意外退出

WebView2 进程组中的大多数进程都与使用它的所有 WebView2 控件相关联,并将引发ProcessFailed到每个控件,

  • 故障类型:PpapiBrokerProcessExitedPpapiPluginProcessExitedRenderProcessUnresponsiveSandboxHelperProcessExited、 或 UnknownProcessExited
  • 失败原因:任何,但 和 ProfileDeleted除外Unresponsive

这些进程失败不是致命的,应用程序 不需要 处理其中任何故障的恢复,但可以收集信息来了解任何持久性问题。

处理无响应呈现器

当 WebView2 控件中主帧的呈现器进程对用户输入无响应时,将引发以下 ProcessFailed 事件:

  • 故障类型:RenderProcessUnresponsive
  • 失败原因:Unresponsive

只要进程保持无响应,事件就会继续引发。 呈现器进程无响应的原因如下:

  • 有一个 长时间运行的脚本 正在执行。 例如,WebView2 控件中的 Web 内容可能正在执行同步 XHR,或者已进入无限循环。 通过调用 Reload) 重新加载 WebView2 控件 (可能会使控件再次响应。

  • 系统正忙

此事件将重复引发 (例如,每隔 15 秒) 引发一次,因此需要确定应用程序对其执行操作的阈值。

处理主浏览器进程退出

BrowserProcessExited 事件指示主浏览器进程已退出,其资源 (包括其子进程) 已释放。 发生这种情况的原因如下:

  • 已关闭 来自 CoreWebView2Environment 的所有 WebView2 控件。 示例应用方案包括:

    • 清除用户数据文件夹。
    • 更新 WebView2 运行时。
    • 使用其他环境配置重启。
    • 清除身份验证缓存。
  • 主浏览器进程失败。 请参阅上面的 主浏览器进程意外退出

此事件适用于涉及 WebView2 运行时资源的操作。 应用程序可以使用事件参数中的退出类型和进程 ID 来确定何时以及如何处理事件。 例如,你可能希望与 ProcessFailed 事件处理程序协调,以防止在尝试恢复的同时尝试删除用户数据文件夹时可能出现的争用情况。

清除用户数据文件夹

应用程序需要等到 WebView2 运行时释放用户 数据文件夹 后才能删除其内容。 关闭所有 WebView2 控件后, BrowserProcessExited 该事件指示已发生这种情况,并且应用程序可以继续执行该操作。

另请参阅:

更新 WebView2 运行时

为了在更新后使用最新的 WebView2 运行时,应用程序需要关闭所有 WebView2 控件并创建新的 CoreWebView2Environment。 若要确保使用新版本,应用程序必须等待 BrowserProcessExited 事件;否则,创建新环境时,主浏览器进程可能会保持活动状态,切换到新版本会失败。

使用不同的环境配置重启

用于 CoreWebView2Environment 的大多数配置都绑定到主浏览器进程生存期。 为了 (语言) 更改此配置,应用程序需要关闭现有 WebView2 控件并等待 BrowserProcessExited 重新创建控件;否则,从新的 CoreWebView2Environment 初始化 WebView2 控件可能会失败,但配置不兼容。

清除身份验证缓存

身份验证缓存存储来自 HTTPS 客户端证书请求的证书选择和凭据。

身份验证缓存绑定到主浏览器进程生存期。 因此,若要清除身份验证缓存,应用程序必须从新的主浏览器进程实例重新创建其 WebView2 控件。

为了确保在重新创建 WebView2 控件时使用新的主浏览器进程实例,应用程序在继续操作之前必须等待 BrowserProcessExited 事件;否则,在重新创建控件时,主浏览器进程可能会保持活动状态,这将保留身份验证缓存,而不是按预期清除它。

另请参阅