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