【问题标题】:Browser.Load is spawning a new Process when trying to load new URLBrowser.Load 在尝试加载新 URL 时产生一个新进程
【发布时间】:2019-02-09 19:13:27
【问题描述】:

我已经为 WPF 应用程序嵌入了 CefSharp 浏览器,我正在尝试加载网页。我也使用绑定了 JavaScript 对象 RegisterJsObject 函数。这是网页的 JS 调用 Native 应用程序所必需的。

如果页面加载需要时间/任何错误,我已经实现了 WatchDogTimer 以切换到错误页面。 问题是,当它在超时的情况下尝试加载错误页面时,它正在杀死现有的 CefSharp.BrowserSubprocess.exe 并创建一个新的。但这会丢失 JavaScript 绑定,因此无法从 JS 调用 Native App。

有什么办法可以避免创建 CefSharp.BrowserSubprocess.exe 的新进程?

【问题讨论】:

  • 请在下面查看我的回答,了解如何防止创建新进程。但我不能 100% 确定它是否能解决缺少 JavaScript 绑定的问题。你能告诉我你的初始网页的网址是什么,你的错误页面的网址是什么?
  • 如果您使用的是旧版绑定,那么这是预期的,请参阅cefsharp.github.io/api/71.0.0/html/…
  • 使用较新的绑定方式是最好的选择github.com/cefsharp/CefSharp/wiki/…

标签: cefsharp chromium-embedded


【解决方案1】:

您可以使用 CefSettings 类来更改此行为。默认情况下,Chromium 会为用户访问的每个站点实例创建一个渲染器进程,但您可以更改它

var settings = new CefSettings();

settings.CefCommandLineArgs.Add("renderer-process-limit", "0");    

Cef.Initialize(settings);

请注意,您必须在创建 ChromiumWebBrowser 的第一个实例之前执行此操作。

重要提示:正如amaitland 在他下面的评论中提到的,你应该非常小心地使用它并且

仅当您使用单个浏览器实例时,您甚至应该 考虑这样做。单个进程中托管的多个实例可以 很容易耗尽内存,一次崩溃,它们都停止工作。 此外,如果渲染进程由于某种原因崩溃,新的 实例不会绑定对象。

如果您使用的是旧版绑定,那么这是正常的,请参阅 http://cefsharp.github.io/api/71.0.0/html/P_CefSharp_CefSharpSettings_LegacyJavascriptBindingEnabled.htm

使用较新的绑定方式是最好的选择https://github.com/cefsharp/CefSharp/wiki/General-Usage#3-how-do-you-expose-a-net-class-to-javascript

【讨论】:

  • 这个答案应该有一个很大的警告,只有当你使用单个浏览器实例时,你才应该考虑这样做。托管在单个进程中的多个实例很容易耗尽内存、一次崩溃并且它们都停止工作。此外,如果渲染进程因任何原因崩溃,新实例将不会绑定对象。
  • 很明显,当您想像基于 CefSharp 的“另一个浏览器”一样构建同时打开多个网站时,使用此设置很危险。但我不认为这里是这样的,不是吗?
  • 经验表明您必须包含免责声明,人们会复制和粘贴任何旧代码并在断章取义的情况下使用它,而不会再三思而后行。令人惊讶的是,这种情况发生的频率如此之高。我认为最安全的选择是使用较新的绑定方法并获得可靠的结果。
  • 同意,我已经更新了上面的答案。感谢您的宝贵意见。
猜你喜欢
  • 1970-01-01
  • 2019-10-12
  • 2015-05-26
  • 1970-01-01
  • 1970-01-01
  • 2017-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多