Cefsharp 在尝试加载新URL时,加载正在生成一个新进程

Cefsharp 在尝试加载新URL时,加载正在生成一个新进程,cefsharp,chromium-embedded,Cefsharp,Chromium Embedded,我已经为WPF应用程序嵌入了CefSharp浏览器,我正在尝试加载一个网页。我还使用 RegisterJsObject函数。这是必需的,因为网页的JS调用本机应用程序 我已经实现了一个WatchDogTimer,如果页面加载需要时间/任何错误,就可以切换到错误页面。 问题是,当它试图在超时情况下加载错误页面时,它正在终止现有的CefSharp.BrowserSubprocess.exe并创建一个新的。但这会丢失JavaScript绑定,因此无法从JS调用本机应用程序 有没有办法避免创建CefSh

我已经为WPF应用程序嵌入了CefSharp浏览器,我正在尝试加载一个网页。我还使用 RegisterJsObject函数。这是必需的,因为网页的JS调用本机应用程序

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


有没有办法避免创建CefSharp.BrowserSubprocess.exe的新进程

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

var settings = new CefSettings();

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

Cef.Initialize(settings);
请注意,必须在创建ChromiumWebBrowser的第一个实例之前执行此操作

重要提示:正如他在下面的评论中所提到的,你应该非常谨慎地使用它

只有在使用单个浏览器实例时,才应 考虑这样做。可以在单个进程中承载多个实例 很容易耗尽内存,一次崩溃,它们都停止工作。 此外,如果渲染过程因任何原因崩溃,新的 实例将不会绑定对象


如果您使用的是传统绑定,那么这是预期的,请参阅


使用更新的绑定方法是最好的选择


请参阅下面我关于如何防止创建新流程的回答。但我不能100%确定它是否能解决缺少JavaScript绑定的问题。您能告诉我您的初始网页的URL是什么,错误网页的URL是什么吗?如果您使用的是旧绑定,那么这是预期的,请参阅使用较新的绑定方法是最佳选择此答案应附带一个大的警告,只有当你使用一个浏览器实例时,你才应该考虑这样做。一个进程中承载的多个实例很容易耗尽内存,一次崩溃,它们都会停止工作。此外,如果渲染过程因任何原因崩溃,则新实例将不会绑定对象。很明显,如果您希望构建另一个基于CefSharp的浏览器,同时打开多个网站,则使用此设置很危险。但我不认为这里是这样的,不是吗?经验告诉我们,你必须包含一个免责声明,人们会复制和粘贴任何旧代码,并断章取义地使用它,而不需要再三考虑。令人惊讶的是,这种情况经常发生。在我看来,最安全的选择是使用更新的绑定方法并获得可靠的结果。同意,我已经更新了上面的答案。谢谢你的宝贵留言。