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

时间:2018-06-11 16:31:33

标签: c# .net wpf events cefsharp

让WPF客户端使用最新的CefSharp软件包来托管Web应用程序。由于我们有多个Web应用程序,因此我们有多个视图,每个视图都有自己的浏览器/ BrowserSubProcess实例。

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

一种想法是通过某种pinvoke查询来加入这个过程,但这是一种我宁愿不打开的蠕虫。

1 个答案:

答案 0 :(得分:1)

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

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

  1. 从头开始,
  2. Example RequestHandler
  3. 使用完整实施的示例
  4. 或使用DefaultRequestHandlerDefaultRequestHandler Override Example)。
  5. 执行某些操作

    因此,如果我们使用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;
    }
    

    如果我们在View中声明了一个浏览器对象,比如说:

    <!--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}")
        );
    }