在 WebView2 中處理程式相關事件
WebView2 會使用多個進程來支援應用程式中的 WebView2 控制件。 因為這些進程可以在使用期間結束,所以 WebView2 會提供 CoreWebView2.ProcessFailed
和 CoreWebView2Environment.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) 和失敗 (結束、無回應) 。 轉譯器行程會在 主畫面 轉譯器中進一步分割 (RenderProcessExited
、RenderProcessUnresponsive
) 和 子框架 轉譯器 ()FrameRenderProcessExited
。ProcessFailedReason
. 指出造成失敗的問題類別。 其中一些 失敗原因 僅適用於特定 的失敗類型。
主要瀏覽器程式意外結束
您應用程式中使用相同環境元件的所有 WebView2 控制件都會收到事件, ProcessFailed
其中包含:
-
失敗種類:
BrowserProcessExited
。 -
失敗原因:任何,但和
LaunchFailed
除外Unresponsive
。
所有相關聯的 WebView2 控制件都會關閉,而且您的應用程式 必須處理此失敗的復原 。 必須重新建立 WebView2 控制件。
也會從 CoreWebview2Environment
引發單一BrowserProcessExited
事件,但不保證這些事件的順序。 當瀏覽器進程當機時,您的應用程式必須協調這兩個事件的事件處理程式。 請參閱 下面的處理主要瀏覽器程序結束。
WebView2 控件中的進程轉譯內容意外結束
受影響框架中的內容 (主要或子框架) 會取代為錯誤頁面。 每個會影響內容的 WebView2 控制件都會收到事件, ProcessFailed
其中包含:
-
失敗種類:
RenderProcessExited
或FrameRenderProcessExited
。 -
失敗原因:任何,但和
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
至每個控制項:
-
失敗種類:
PpapiBrokerProcessExited
、PpapiPluginProcessExited
、RenderProcessUnresponsive
、SandboxHelperProcessExited
或UnknownProcessExited
。 -
失敗原因:任何,但和
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
事件再繼續;否則,重新建立控件時,主要瀏覽器進程可能會保持運作,這樣會保留驗證快取,而不是如預期般清除它。
另請參閱
- WebView2 應用程式的程式模型
- WebView2 功能和 API 概觀中的程式管理。
- WebView2 API 參考