Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 子进程退出或崩溃时的事件或通知_C#_.net_Wpf_Events_Cefsharp - Fatal编程技术网

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

C# 子进程退出或崩溃时的事件或通知,c#,.net,wpf,events,cefsharp,C#,.net,Wpf,Events,Cefsharp,拥有一个WPF客户端,该客户端使用最新的CefSharp包托管web应用程序。因为我们有多个web应用程序,所以我们有多个视图,每个视图都有自己的浏览器/浏览器子流程实例 比如说,由于缺少更好的示例,我只需进入任务管理器并杀死其中一个子进程.exe。是否有我们可以参与或以其他方式得到通知的活动 一种想法是通过某种pinvoke查询来钩住这个过程,但这是一罐我不愿打开的蠕虫。感谢@amaitland为我指明了正确的方向。这有点像大海捞针,但它确实存在 对于任何感兴趣的人,您必须实现上面他评论中引用

拥有一个WPF客户端,该客户端使用最新的CefSharp包托管web应用程序。因为我们有多个web应用程序,所以我们有多个视图,每个视图都有自己的浏览器/浏览器子流程实例

比如说,由于缺少更好的示例,我只需进入任务管理器并杀死其中一个子进程.exe。是否有我们可以参与或以其他方式得到通知的活动


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

感谢@amaitland为我指明了正确的方向。这有点像大海捞针,但它确实存在

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

  • 从头做起
  • 使用他们在
  • 或者在两者之间使用()
  • 因此,如果我们使用
    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;
    }
    

    在事件处理程序中,您可以将发送者强制转换为ChromiumWebBrowser并访问它的调度程序,从而稍微简化代码。@amaitland Yep,看到了。我这样做更多的是作为一种模式,而不是其他任何东西。这样,所有内容都是基于上下文的,没有额外的强制转换。但是您是对的,您可以通过强制转换在重写的方法中轻松地处理它。
    <!--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}")
        );
    }