释放WindowsFormsHost时出现非托管内存泄漏问题求助
混合WPF/WinForms架构下WindowsFormsHost非托管内存泄漏排查问题
背景
我们正在将一个大型WindowsForms应用重构为WPF应用,因重构周期较长,采用混合架构:新面板使用纯WPF实现,原有WindowsForms元素通过WindowsFormsHost控件托管显示,使用Syncfusion的WPF Docking Manager以标签页形式展示这些页面。
问题现象
打开并关闭近100个包含WindowsFormsHost的页面后,系统出现内存耗尽情况。经JetBrains DotMemory分析,泄漏出现在非托管内存中,且WindowsFormsHost及其子内容看似已被正确释放。
已实施的处理措施
我们参考相关方案进行了以下处理:
- 将WindowsFormsHost包裹在Grid中,释放时清空Grid:
public override void Dispose() { if (this.Content is Grid grid && grid.Children.Count == 1) { if (grid.Children[0] is KWFHost wfh) { wfh.Child.SizeChanged -= ControlSizeChanged; wfh.Dispose(); } grid.Children.Clear(); } base.Dispose(); }
- 自定义继承自WindowsFormsHost的
KWFHost类,重写Dispose方法以确保子控件释放:
public class KWFHost : WindowsFormsHost { protected override void Dispose(bool disposing) { if (this.Child is IDisposable disposable) { disposable.Dispose(); } this.Child = null; base.Dispose(true); } }
- 添加Grid与WindowsFormsHost的代码:
public void SetContent(System.Windows.Forms.Control control) { var host = new KWFHost(); host.Child = control; control.SizeChanged += ControlSizeChanged; var grid = new Grid(); grid.Children.Add(host); this.Content = grid; }
疑问
从内存分配结果来看,我们怀疑托管机制导致了泄漏,希望了解:
- WindowsFormsHost是否存在已知问题可解释该非托管内存泄漏现象?
- 还有哪些方法可以进一步定位问题根源?
内容的提问来源于stack exchange,提问作者Tom RAVANEL
相关产品推荐
相关产品推荐

