cefsharp 子进程退出或崩溃时的事件或通知
Event or notification when a cefsharp subprocess exits or crashes
有一个使用最新的 CefSharp 包来托管 Web 应用程序的 WPF 客户端。由于我们有多个网络应用程序,因此我们有多个视图,每个视图都有自己的 browser/BrowserSubProcess 实例。
说,由于没有更好的例子,我只是进入任务管理器并杀死 SubProcess.exe 中的一个。是否有我们可以利用或以其他方式收到通知的事件?
一个想法是通过某种 pinvoke 查询来挂钩进程,但这是一堆我不想打开的蠕虫病毒。
感谢@amaitland 为我指明了正确的方向。它有点大海捞针,但它就在那里。
对于任何感兴趣的人,您必须实施他在上面的评论中引用的 IRequestHandler
。您可以
- 从头开始,
- 在 Example RequestHandler、
使用他们完全实现的示例
- 或使用 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}")
);
}
有一个使用最新的 CefSharp 包来托管 Web 应用程序的 WPF 客户端。由于我们有多个网络应用程序,因此我们有多个视图,每个视图都有自己的 browser/BrowserSubProcess 实例。
说,由于没有更好的例子,我只是进入任务管理器并杀死 SubProcess.exe 中的一个。是否有我们可以利用或以其他方式收到通知的事件?
一个想法是通过某种 pinvoke 查询来挂钩进程,但这是一堆我不想打开的蠕虫病毒。
感谢@amaitland 为我指明了正确的方向。它有点大海捞针,但它就在那里。
对于任何感兴趣的人,您必须实施他在上面的评论中引用的 IRequestHandler
。您可以
- 从头开始,
- 在 Example RequestHandler、 使用他们完全实现的示例
- 或使用 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}")
);
}