解决销毁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(); } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)