共用方式為


在 WebView2 中處理程式相關事件

WebView2 會使用多個進程來支援應用程式中的 WebView2 控制件。 因為這些進程可以在使用期間結束,所以 WebView2 會提供 CoreWebView2.ProcessFailedCoreWebView2Environment.BrowserProcessExited 事件,讓您的應用程式回應不同的案例。 使用本文件瞭解如何使用這些事件在這些案例發生時做出回應。

若要改善 WebView2 應用程式的可靠性,建議您的應用程式至少處理下列事件:

若要使用本文,建議您先閱讀 WebView2 應用程式的進程模型。 如需本文所涵蓋的程式相關 API 清單,請參閱 WebView2 功能和 API 概觀中的程式管理

結束或失敗的進程事件

當您初始化 WebView2 控制項時,WebView2 會確保有 WebView2 運行時間可為控件提供電源,並連線到其 WebView2 進程群組。 建立此連線之後,您的控件將會開始監視這些進程並報告下列事件,讓您的應用程式可以據以回應:

  • 任何進程失敗。 當 WebView2 運行時間中 的任何進程 失敗時,CoreWebView2 會引發 ProcessFailed 事件。 這可能是因為進程當機,或轉譯器進程沒有回應。 使用此事件來診斷和從 WebView2 進程中的失敗復原。 請參閱 處理進程損毀WebView2 控件中的進程轉譯內容意外結束,如下所示。

  • 主要瀏覽器進程結束。 如果主要瀏覽器進程因 任何原因而結束, CoreWebView2Environment 則 會引發 BrowserProcessExited 事件。 使用此事件來同步處理涉及 WebView2 執行時間資源和存留期的作業,例如 使用者資料資料夾 管理和更新。 請參閱 下面的處理主要瀏覽器程序結束

  • 主要瀏覽器進程當機。 當主要瀏覽器進程當機時,它會產生 ProcessFailed 事件和 BrowserProcessExited 事件,因為主要瀏覽器進程因為失敗而 結束

收集程式失敗詳細數據

事件 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至每個控制項:

  • 失敗種類:PpapiBrokerProcessExitedPpapiPluginProcessExitedRenderProcessUnresponsiveSandboxHelperProcessExitedUnknownProcessExited
  • 失敗原因:任何,但和 ProfileDeleted除外Unresponsive

這些程式失敗並不嚴重,而且您的應用程式 不需要 處理其中任何一個的復原,但可以收集資訊以瞭解任何持續性問題。

處理沒有回應的轉譯器

當 WebView2 控制件中主要畫面格的轉譯器進程對使用者輸入沒有回應時, ProcessFailed 將會引發事件,並包含:

  • 失敗種類:RenderProcessUnresponsive
  • 失敗原因:Unresponsive

只要進程沒有回應,就會繼續引發事件。 轉譯器進程沒有回應的原因如下:

  • 正在執行 長時間執行的腳本 。 例如,WebView2 控制件中的 Web 內容可能正在執行同步 XHR,或已進入無限迴圈。 藉由呼叫 Reload) 重載 WebView2 控件 (,可能會讓控件再次回應。

  • 系統忙碌中

此事件會重複引發 (例如,每隔 15 秒) 一次,因此您必須決定應用程式對其採取動作的臨界值。

處理已結束的主要瀏覽器進程

事件 BrowserProcessExited 指出主要瀏覽器進程已結束,且其資源 (包括其子進程) 已釋出。 這可能是因為下列原因而發生:

  • 來自的所有 WebView2 控制 CoreWebView2Environment 件都已關閉。 範例應用程式案例包括:

    • 清除使用者資料資料夾。
    • 更新 WebView2 運行時間。
    • 使用不同的環境組態重新啟動。
    • 清除驗證快取。
  • 主要瀏覽器程序失敗。 請參閱上方 的主要瀏覽器進程意外結束

此事件適用於涉及 WebView2 執行時間資源的作業。 您的應用程式可以使用事件自變數的 結束種類進程標識 碼來判斷處理事件的時機和方式。 例如,您可能想要與 ProcessFailed 事件處理程式協調,以避免在嘗試復原時,也嘗試移除使用者數據資料夾時發生競爭狀況。

清除使用者資料資料夾

您的應用程式必須等到 WebView2 執行時間發行 使用者資料資料夾 之後,才能刪除其內容。 關閉所有 WebView2 控制件之後, BrowserProcessExited 事件會指出這已發生,而且您的應用程式可以繼續進行作業。

另請參閱:

更新 WebView2 運行時間

若要在更新之後使用最新的 WebView2 執行時間,您的應用程式必須關閉所有 WebView2 控制項並建立新的 CoreWebView2Environment。 若要確保使用新版本,您的應用程式必須等候 BrowserProcessExited 事件;否則,當新環境建立時,主要瀏覽器進程可能會保持運作,而切換至新版本將會失敗。

使用不同的環境組態重新啟動

用於的大部分組 CoreWebView2Environment 態會系結至主要瀏覽器進程存留期。 例如,若要變更此組態 (語言) ,您的應用程式必須關閉現有的 WebView2 控件,並在重新建立控件之前等候 BrowserProcessExited ;否則,從新的 CoreWebView2Environment 初始化 WebView2 控件可能會因組態不相容而失敗。

清除驗證快取

驗證 快取 會儲存來自 HTTPS 用戶端憑證要求的憑證選取和認證。

驗證快取會系結至主要瀏覽器進程存留期。 因此,若要清除驗證快取,您的應用程式必須從新的主要瀏覽器進程實例重新建立其 WebView2 控制件。

若要確保在重新建立 WebView2 控制項時使用新的主要瀏覽器進程實例,您的應用程式必須先等候 BrowserProcessExited 事件再繼續;否則,重新建立控件時,主要瀏覽器進程可能會保持運作,這樣會保留驗證快取,而不是如預期般清除它。

另請參閱