项目原因,在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(); } } }
标签:cef,解决办法,Process,List,diffIds,进程,卡顿 From: https://www.cnblogs.com/mengjiulong/p/18583708