次の方法で共有


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 ランタイムでクラッシュが発生すると、クラッシュ プロセスに関連付けられているすべての WebView2 コントロールに対して ProcessFailed イベントが発生します。 エラーは回復可能な場合と回復できない場合があり、一部のエラーは自動回復可能です。

イベント引数の次のプロパティを使用して、エラーを特定できます。

  • ProcessFailedKind. プロセスの目的 (ブラウザー、レンダラー、GPU など) とエラー (終了、応答なし) の組み合わせ。 レンダラー プロセスは、 メイン フレーム レンダラー (RenderProcessExitedRenderProcessUnresponsive) と サブフレーム レンダラー (FrameRenderProcessExited) でさらに分割されます。

  • ProcessFailedReason. エラーの原因となった問題のカテゴリを示します。 これらの エラーの理由 の一部は、特定の エラーの種類にのみ適用されます。

ブラウザーのメイン プロセスが予期せず終了しました

同じ環境構成を使用するアプリケーション内のすべての WebView2 コントロールは、次の ProcessFailed イベントを受け取ります。

  • エラーの種類:BrowserProcessExited
  • エラーの理由:UnresponsiveLaunchFailedを除く任意。

関連付けられているすべての WebView2 コントロールが閉じられ、アプリケーションはこのエラーからの 回復を処理する必要があります 。 WebView2 コントロールを再作成する必要があります。

1 つの BrowserProcessExited イベントも CoreWebview2Environment から発生しますが、これらのイベントの順序は保証されません。 アプリケーションは、ブラウザー プロセスがクラッシュしたときに、これら 2 つのイベントのイベント ハンドラーを調整する必要があります。 以下の「 終了したメイン ブラウザー プロセスを処理する」を参照してください。

WebView2 コントロールのコンテンツをレンダリングするプロセスが予期せず終了しました

影響を受けたフレーム (メインまたはサブフレーム) のコンテンツがエラー ページに置き換えられます。 コンテンツが影響を受けるすべての WebView2 コントロールは、次の ProcessFailed イベントを受け取ります。

  • エラーの種類:RenderProcessExited または FrameRenderProcessExited
  • エラーの理由:UnresponsiveProfileDeletedを除く任意。

アプリケーションでは、このエラーからの 回復を処理する必要があります 。 メイン フレームが影響を受けた場合 (RenderProcessExited)、 Reload API を使用してコントロール内のコンテンツを再読み込みできます。 または、WebView2 コントロールを Close して再作成することもできます。

メイン フレームが影響を受けなかった場合 (FrameRenderProcessExited)、アプリケーションはメイン フレームと通信して、影響を受けるフレーム内のコンテンツを回復できます。 ProcessFailed イベントは、FrameInfosForFailedProcess プロパティを介して影響を受けたフレームの詳細を提供します。

GPU プロセスが予期せず終了しました

プロセスが自動的に再作成されると、WebView2 コントロール内のコンテンツが点滅する可能性があります。 WebView2 プロセス グループ内のすべての WebView2 コントロールは、次のProcessFailedイベントを受け取ります。

  • エラーの種類:GpuProcessExited
  • エラーの理由:UnresponsiveProfileDeletedを除く任意。

これは最も一般的な WebView2 プロセスエラーであり、自動回復可能です。 アプリケーションでは、このイベントの回復を処理する必要 はありませんが 、永続的な問題を理解するために情報を収集したり、GPU プロセスの終了を繰り返す根本的な原因がある場合は収集できます。

ユーティリティ プロセスが予期せず終了しました

中断が発生する可能性があります (たとえば、ユーティリティ プロセスがオーディオ サービスをホストしていた場合)、必要なプロセスが自動的に再作成されます。 WebView2 プロセス グループ内のすべての WebView2 コントロールは、次のProcessFailedイベントを受け取ります。

  • エラーの種類:UtilityProcessExited
  • エラーの理由:UnresponsiveProfileDeletedを除く任意。

このプロセスエラーは致命的ではなく、自動回復可能です。 アプリケーションでは、このイベントの回復を処理する必要 はありませんが 、イベント引数で提供される ProcessDescription など、永続的な問題を理解するために情報を収集できます。

その他のプロセスが予期せず終了しました

WebView2 プロセス グループ内のほとんどのプロセスは、それを使用するすべての WebView2 コントロールに関連付けられているため、次を使用して各コントロールにProcessFailedが発生します。

  • エラーの種類:PpapiBrokerProcessExitedPpapiPluginProcessExitedRenderProcessUnresponsiveSandboxHelperProcessExited、または UnknownProcessExited
  • エラーの理由:UnresponsiveProfileDeletedを除く任意。

これらのプロセスエラーは致命的ではなく、アプリケーションはそれらの回復を処理する必要 はありませんが 、永続的な問題を理解するために情報を収集できます。

応答しないレンダラーを処理する

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 イベントを待ってから続行する必要があります。それ以外の場合は、コントロールが再作成されたときにメイン ブラウザー プロセスが存続する可能性があります。これにより、目的どおりにクリアされる代わりに認証キャッシュが保持されます。

関連項目