EKsumic's Blog

let today = new Beginning();

Click the left button to use the catalog.

OR

CefSharp的一些使用注意事项

1. 注意不要反复初始化

在初始化的时候,比如:

//初始化一个browser
public ChromiumWebBrowser browser;
//初始化参数设定
public void InitBrowser()
{
    //注意,这里多写了一个判定,如果不写这个,你一定会报错,至于为什么,你自己想
    if (Cef.IsInitialized == false)
    {
        Cef.Initialize(new CefSettings());
    }
    
    browser = new ChromiumWebBrowser("https://www.google.com");

    this.Controls.Add(browser);

    browser.Dock = DockStyle.Fill;

    browser.LoadingStateChanged += Browser_LoadingStateChanged;
}

2. 关于判断网页是否加载完成

一般建议是用这个来判定:

bool checkBrowser = browser.GetBrowser().IsLoading;

3. 关于判断网页是否加载完成,你发现执行判断多次,特别是有一种情况是页面是加载完了,但页面里面的元素实际上是还未显示出来的情况,

那建议看这篇博文:https://www.cnblogs.com/Huzi-note/p/CefSharp_AwaitPageLoaded.html

代码:

public static async Task<bool> IsLoading(this ChromiumWebBrowser browser)
{
      while (browser.GetBrowser().IsLoading)
      {
           await Task.Delay(500);
      }
      return true;
}

4. 建议在Form_closing的时候,删除掉这个:

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    //为什么要删除,是因为关闭CefSharp也算一次触发,而FormClosing的优先级是大于CefSharp,所以我先把这个拿减掉
    browser.LoadingStateChanged -= Browser_LoadingStateChanged;
}

5. 建议在Form_Closed的时候,释放掉这个browser:

private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
    browser.Dispose();
}

你不释放掉那你就等着你的风扇狂转吧。

查了一下,GC好像并不会主动释放CefSharp生成的Sub进程,如果你多次调试项目,你马上就会发现你CPU爆满。

 

推荐阅读:

[1] C#(CSharp)用CefSharp开发浏览器--鼠标模拟,自动点击,鼠标移动,鼠标事件

This article was last edited at 2020-09-03 04:21:54

* *