解决销毁cef时出现卡顿现象的另类解决办法

项目原因,在WPF中使用cef加载网页,但是在关闭弹窗时会发生卡顿现象,经调试发现是cef销毁耗时太长从而造成的卡顿,目前在网上没有找到有效的解决方法(没精力研究源码),因此找到了一种另类的解决方法。

通过观察任务管理器发现,没有使用cef加载内容时都会有一个叫“CefSharp.BrowserSubprocess”的进程,

而在销毁时,相应的进程也会关闭,因此可以在弹窗关闭时用过杀死进程来达到快速关闭、去除卡顿现象的效果。

首先声明灵感字段记录进程id:

private List<int> OldCefBrowserSubprocessIds = new List<int>();
private List<int> NewCefBrowserSubprocessIds = new List<int>();

在窗体的初始化中记录已有的进程id:

复制代码
public CefWindow()
        {
            InitializeComponent();

            OldCefBrowserSubprocessIds = GetAllCefBrowserSubprocessIds();
        }

/// <summary>
        /// 获取BrowserSubprocess所有进程的id
        /// </summary>
        private List<int> GetAllCefBrowserSubprocessIds()
        {
            Process[] processes = Process.GetProcesses();
            List<int> pids = new List<int>();
            foreach (Process process in processes)
            {
                if (process.ProcessName == "CefSharp.BrowserSubprocess")
                {
                    pids.Add(process.Id);
                }
            }
            return pids;
        }
复制代码

最后在窗体销毁时获取当前窗体使用的cef进程id,然后杀死该进程:

复制代码
protected override void OnClosing(CancelEventArgs e)
        {
            base.OnClosing(e);

            //通过直接杀死新窗口所启动的cefbrowserSubprocess进程,来达到快速关闭的效果
            NewCefBrowserSubprocessIds = GetAllCefBrowserSubprocessIds();
            var diffIds = NewCefBrowserSubprocessIds.Except(OldCefBrowserSubprocessIds).ToArray();
            if (diffIds != null && diffIds.Count() > 0)
            {
                foreach (var diffId in diffIds)
                {
                    Process p = Process.GetProcessById(diffId);
                    p.Kill();
                }
            }
        }
复制代码

 

posted @   梦九龍  阅读(91)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示