cefsharp解决CefSharp.Cef.Shutdown() 时主程序退出的问题

 

 

 CefSharp.CefSettings setting = new CefSharp.CefSettings();
                setting.Locale = "zh-CN";
                setting.CachePath = "CHBrowser/BrowserCache3";//缓存路径 
                setting.AcceptLanguageList = "zh-CN,zh;q=0.8";//浏览器引擎的语言
                setting.LocalesDirPath = "CHBrowser/localeDir3";//日志
                setting.LogFile = "CHBrowser/LogData";//日志文件
                setting.PersistSessionCookies = true;//
                setting.UserAgent = "";//浏览器内核
                setting.UserDataPath = "CHBrowser/userData3";//个人数据
                CefSharp.Cef.Initialize(setting);

                CefSharp.WinForms.ChromiumWebBrowser WebBrowser = new CefSharp.WinForms.ChromiumWebBrowser("http://www.baidu.com"); //初始页面

                WebBrowser.Dock = DockStyle.Fill;//设置停靠方式
                this.Controls.Add(WebBrowser);//加入窗体

在程序初始化的时候,我们需要初始化浏览器参数,以前我都是这样初始化的:

 

1

2

 

CefSharp.CefSettings setting = new CefSharp.CefSettings();

CefSharp.Cef.Initialize(setting);

但是其实应该这样初始化:

 

1

2

 

CefSharp.CefSettings setting = new CefSharp.CefSettings();

CefSharp.Cef.Initialize(setting, false, false);

看接口注释:

//

// 摘要:

// Initializes CefSharp with user-provided settings. This function should be

// called on the main application thread to initialize the CEF browser process.

//

// 参数:

// cefSettings:

// CefSharp configuration settings.

//

// shutdownOnProcessExit:

// When the Current AppDomain (relative to the thread called on) Exits(ProcessExit

// event) then Shudown will be called.

//

// performDependencyCheck:

// Check that all relevant dependencies avaliable, throws exception if any are

// missing

public static bool Initialize(CefSettings cefSettings, bool shutdownOnProcessExit, bool performDependencyCheck);

第二个参数就是用来设置是否在退出的时候释放资源,默认为true,就会在当前页面退出的时候调用Shudown。然后Shudown就会把整个浏览器的资源释放掉。当浏览器资源被释放了以后,其他页面访问资源就变成了空指针访问,然后就会挂掉。

所以我们如果是做多页面窗口的话,需要手动将这个参数置为false。这样才能保证一个页面关闭时,其他页面不受影响。

至于当前被关闭页面的资源释放,我们需要显示的调用ChromiumWebBrowser的父控件的Dispose方法。如下官方示例代码所示:

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

 

private void CloseTabToolStripMenuItemClick(object sender, EventArgs e)

{

var currentIndex = browserTabControl.SelectedIndex;

var tabPage = browserTabControl.Controls[currentIndex];

var control = GetCurrentTabControl();

if (control != null)

{

control.Dispose();

}

browserTabControl.Controls.Remove(tabPage);

tabPage.Dispose();

}

最后,在主程序退出时,需要显式的调用CefSharp.Cef.Shutdown(),用来释放资源;比如FormClosing的时候。

另外,CefSharp.Cef.Initialize需要在和ChromiumWebBrowser使用的地方放在一起,不可跨DLL初始化。因为静态函数,静态变量是无法跨DLL使用的。所以如果初始化和使用的地方不在同一个DLL内,则无效。

 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 2

打赏作者

ourstoryzj

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值