cefsharp 子进程退出或崩溃时的事件或通知

Event or notification when a cefsharp subprocess exits or crashes

有一个使用最新的 CefSharp 包来托管 Web 应用程序的 WPF 客户端。由于我们有多个网络应用程序,因此我们有多个视图,每个视图都有自己的 browser/BrowserSubProcess 实例。

说,由于没有更好的例子,我只是进入任务管理器并杀死 SubProcess.exe 中的一个。是否有我们可以利用或以其他方式收到通知的事件?

一个想法是通过某种 pinvoke 查询来挂钩进程,但这是一堆我不想打开的蠕虫病毒。

感谢@amaitland 为我指明了正确的方向。它有点大海捞针,但它就在那里。

对于任何感兴趣的人,您必须实施他在上面的评论中引用的 IRequestHandler。您可以

  1. 从头开始,
  2. Example RequestHandler
  3. 使用他们完全实现的示例
  4. 或使用 DefaultRequestHandler (DefaultRequestHandler Override Example).

所以如果我们使用 DefaultRequestHandler 我们可以只对终止的事件做这样的事情:

/// <summary>
/// Handle events related to browser requests.
/// </summary>
public class RequestHandler : DefaultRequestHandler
{
    /// <summary>
    /// Called when the render process terminates unexpectedly.
    /// </summary>
    /// <param name="browserControl">The ChromiumWebBrowser control</param>
    /// <param name="browser">the browser object</param>
    /// <param name="status">indicates how the process terminated.</param>
    /// <remarks>
    /// Remember that <see cref="browserControl"/> is likely on a different thread so care should be used
    /// when accessing its properties.
    /// </remarks>
    public override void OnRenderProcessTerminated(IWebBrowser browserControl, IBrowser browser, CefTerminationStatus status)
    {
        switch (status)
        {
            case CefTerminationStatus.AbnormalTermination:
                Log.Error("Browser terminated abnormally.");
                break;

            case CefTerminationStatus.ProcessWasKilled:
                Log.Error("Browser was killed.");
                break;

            case CefTerminationStatus.ProcessCrashed:
                Log.Error("Browser crashed while.");
                break;

            default:
                Log.Error($"Browser terminated with unhandled status '{status}' while at address.");
                break;
        }

        RenderProcessTerminated?.Invoke(browserControl, status);
    }

    /// <summary>
    /// Fires when the render process terminates unexpectedly.
    /// </summary>
    public event EventHandler<CefTerminationStatus> RenderProcessTerminated;
}

如果我们在视图中声明了一个浏览器对象,例如:

<!--Bound to the ViewModel.Address property-->
<cef:ChromiumWebBrowser
    x:Name="Browser"
    Address="{Binding Address}">
</cef:ChromiumWebBrowser>

然后只需连接一个新实例:

private readonly Dispatcher _mainDispatcher;
private readonly RequestHandler _requestHandler = new RequestHandler();

public MainWindow()
{
    InitializeComponent();

    _mainDispatcher = Dispatcher.CurrentDispatcher;
    _requestHandler.RenderProcessTerminated += OnBrowserRenderProcessTerminated;
    Browser.RequestHandler = _requestHandler;
}

private void OnBrowserRenderProcessTerminated(object sender, CefTerminationStatus e)
{
    //Likely coming from a background thread
    _mainDispatcher.InvokeAsync(() =>
        Log.Error($"Browser crashed while at address: {Browser.Address}")
    );
}