代码之家  ›  专栏  ›  技术社区  ›  Ernie S

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

  •  1
  • Ernie S  · 技术社区  · 7 年前

    拥有一个wpf客户端,它使用最新的cefsharp包来托管web应用程序。因为我们有多个web应用程序,所以我们有多个视图,每个视图都有自己的browser/browsersubprocess实例。

    比如说,如果没有一个更好的例子,我就简单地进入任务管理器,杀死其中一个子进程.exe。有没有一个事件我们可以访问或者被通知?

    有一种想法是通过某种类型的pQueKK来查询这个过程,但这是我宁愿不打开的蠕虫。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Ernie S    7 年前

    感谢@amaitland指引我正确的方向。大海捞针,但它就在那儿。

    对于任何感兴趣的人,你必须实施 IRequestHandler 他在上面的评论中提到了这一点。你也可以

    1. 从头开始,
    2. 使用他们在 Example RequestHandler ,
    3. 或者在两者之间做点什么 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}")
        );
    }