WPF ElementHost 内存泄露问题
无意中发现,WPF ElementHost 控件如果未正确释放,会存在内存泄露问题。解决方法如下:
xaml代码:
<Grid x:Name="grid">
<WindowsFormsHost x:Name="host">
<ElementHost x:Name="elementHost">
<local:MultiPlayerController x:Name="multiPlayer"></local:MultiPlayerController>
</ElementHost>
</WindowsFormsHost>
</Grid>
后台资源释放代码:
public void Dispose()
{
multiPlayer.StopAll();
if (elementHost != null)
{
FrameworkElement frameworkElement = elementHost.Child as FrameworkElement;
if (frameworkElement != null)
{
// Memory leak workaround: elementHost.Child.SizeChanged -= elementHost.childFrameworkElement_SizeChanged;
SizeChangedEventHandler handler = (SizeChangedEventHandler)Delegate.CreateDelegate(typeof(SizeChangedEventHandler), elementHost, "childFrameworkElement_SizeChanged");
frameworkElement.SizeChanged -= handler;
}
elementHost.Child = null;
elementHost.Dispose();
elementHost = null;
}
if (host != null)
{
host.Child = null;
host.Dispose();
host = null;
}
grid.Children.Clear();
}
关键代码:
SizeChangedEventHandler handler = (SizeChangedEventHandler)Delegate.CreateDelegate(typeof(SizeChangedEventHandler), elementHost, "childFrameworkElement_SizeChanged");
frameworkElement.SizeChanged -= handler;
另外 grid.Children.Clear() 也不能省。
参考资料:https://stackoverflow.com/questions/24823103/how-to-clear-memoryleak-from-elementhost-control
WPF ElementHost 内存泄露问题的更多相关文章
- WPF不明内存泄露已解决,白头发也没了
原文:WPF不明内存泄露已解决,白头发也没了 在使用OpenExpressApp进行WPF应用开发过程中遇到多个内存泄漏的地方,在上一篇中求助了一个内存泄露问题[WPF不明内存泄露原因,头发都白了几根 ...
- WPF常见内存泄露
Event handlers leak This type of leak occurs when subscribing an object (let's call it listener) to ...
- PF不明内存泄露已解决,白头发也没了(转)
在使用OpenExpressApp进行WPF应用开发过程中遇到多个内存泄漏的地方,在上一篇中求助了一个内存泄露问题[WPF不明内存泄露原因,头发都白了几根],本篇与大家分享一下如何解决此问题的过程. ...
- WPF的TextBox产生内存泄露的情况
前段时间参与了一个WPF编写的项目,在该项目中有这样一个场景:在程序运行过程中需要动态地产生大量文本信息,并追加WPF界面上的一个TextBox的Text中进行显示.编写完之后,运行该项目的程序,发现 ...
- WPF WPF中解决内存泄露的几点提示与解决方法
http://www.cnblogs.com/LastPropose/archive/2011/08/01/2124359.html 一直以来用WPF做一个项目,但是开发中途发现内存开销太大,用ANT ...
- 基于HTML5的WebGL应用内存泄露分析
上篇(http://www.hightopo.com/blog/194.html)我们通过定制了CPU和内存展示界面,体验了HT for Web通过定义矢量实现图形绘制与业务数据的代码解耦及绑定联动, ...
- JavaScript垃圾回收(三)——内存泄露
一.JavaScript内存监测工具 在讨论内存泄露之前,先介绍几款JavaScript内存监测工具. IE的sIEve与JSLeaksDetector(这两个可以在下面的附件中下载),firefox ...
- Net Memory Profiler 分析.Net程序内存泄露
Net Memory Profiler 分析.Net程序内存泄露 Haozes's Tech Space 人類的全部才能無非是時間和耐心的混合物 使用.Net Memory Profiler 分析.N ...
- 可能会导致.NET内存泄露的8种行为
原文连接:https://michaelscodingspot.com/ways-to-cause-memory-leaks-in-dotnet/作者 Michael Shpilt.授权翻译,转载请保 ...
- dotnet 6 在 Win7 系统证书链错误导致 HttpWebRequest 内存泄露
本文记录我将应用迁移到 dotnet 6 之后,在 Win7 系统上,因为使用 HttpWebRequest 访问一个本地服务,此本地服务开启 https 且证书链在此 Win7 系统上错误,导致应用 ...
随机推荐
- C语言十进制转二、八、十六进制
#include <stdio.h> #include <math.h> void D_O(int n); void D_H(int n); void D_B(int n); ...
- 常用【描述性统计指标】含义(by python)
统计学有时候会被误解,好像必须有大量的样本数据,才能使统计结果有意义.这会让我们觉得统计学离我们的日常生活很遥远. 其实,如果数据的准确度高的话,少量的样本数据同样能反映出真实的情况.比如,很多国家选 ...
- AutoCAD ObjectARX 二次开发(2020版)--2,手动创建CAD二次开发项目--
本项目使用手动创建,意为不使用SDK模板. 从Visual Studio的"文件"下拉菜单中,选择"新建"->"项目...". 在出现 ...
- 第一次使用 GoLand 启动 运行 Go 项目
一.开始之前确保已经安装 go语言环境 二.新建项目 三.选择项目路径 四.在该目录下手动创建 bin,src两个文件夹 bin 用来存放编译后的 .exe 文件 src 我们的工程的开发文件存放的点 ...
- jmeter-json断言
1.JSON 断言所在位置:断言->JSON 断言 2.JSON断言中的字段解析 Assert JSON Path exists:json 表达式,判断所字段是否存在,存在则为True, 否则为 ...
- WinForm遍历控件
1 foreach (Control c in this.Controls) 2 { 3 if (c is TextBox) 4 ((TextBox)c).Text = "1111" ...
- [HAOI2018] 字串覆盖
[HAOI2018]字串覆盖 题目描述 小C对字符串颇有研究,他觉得传统的字符串匹配太无聊了,于是他想到了这 样一个问题. 对于两个长度为n的串A, B, 小C每次会给出给出4个参数s, t, l, ...
- 怎么在Android项目中导入ffmpeg库?
1.前言 在这里我以导入静态库(.a)为例进行分析,动态库(.so)是类似的.在导入前,各位要先编译好ffmpeg库,需要注意的是在编译的时候要开启交叉编译,目标平台为Android,其他平台的库(w ...
- 春秋云镜 - CVE-2022-32991
靶标介绍: 该CMS的welcome.php中存在SQL注入攻击. 访问页面,先注册,使用邮箱加密码登录. bp抓包,后台挂上sqlipy然后去测welcome.php,常用的语句都没成功但过一会就有 ...
- python在容器内克隆拉取git私有仓库
前言 目前有个python应用需要在容器镜像内拉取git私有仓库的代码,一开始的想法是用GitPython,折腾一番ssh私钥和known_hosts问题后,发现还是在镜像中封装个git最省事,然后用 ...