使用Visual Studio诊断工具检查内存泄漏——订阅Events

news/2024/11/15 11:43:08/文章来源:https://www.cnblogs.com/cnblogsName/p/18302186

参考文章
8 Ways You can Cause Memory Leaks in .NET

订阅事件导致内存泄漏的原因

订阅事件后,该对象将保留对你的类的引用。除非你使用不捕获类成员的匿名方法。

防止Event内存泄漏的方法

  • 注销订阅事件。
  • 使用弱句柄(weak-handler)模式。
  • 如果可能,请使用匿名函数进行订阅,并且不要捕获任何类成员。

内存泄漏示例代码

public class WifiManager
{// 事件声明public event EventHandler<WifiEventArgs> WifiSignalChanged;
}public class MemoryLeakWithWifiManager
{public MemoryLeakWithWifiManager(WifiManager wifiManager){wifiManager.WifiSignalChanged += OnWifiChanged;}private void OnWifiChanged(object sender, WifiEventArgs e){Console.WriteLine($"WiFi Changed: MemoryLeakWithWifiManager");}
}

wifiManager会引用MemoryLeakWithWifiManager的任何实例,并且垃圾回收器永远不会回收它们。

防止内存泄漏示例代码

public class MemoryLeakAvoidWithWifiManager
{public MemoryLeakAvoidWithWifiManager(WifiManager wifiManager){//使用匿名函数进行订阅,并且不要捕获任何类成员wifiManager.WifiSignalChanged += (s, e) => Console.WriteLine($"WiFi Changed");}
}

使用Visual Studio诊断工具检查内存泄漏

可以在“见解”选项卡中的“事件处理程序泄露”一栏找到“MemoryLeakWithWifiManager”,说明该类发生了Event的内存泄漏。

切换MemoryLeakAvoidWithWifiManager进行测试时,“事件处理程序泄露”中不会找到该类,说明该类不会发生Event的内存泄漏。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/743750.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jetpack Compose(9)——嵌套滚动

自定义 Composable 组件 目录一、Composable 组件渲染流程1.1 组合1.2 布局1.3 绘制二、自定义组合三、自定义布局3.1 LayoutModifier (自定义 View)3.2 Layout (自定义 ViewGroup)3.3 固有特性测量Intrinsic3.3.1 使用内置组件的固有特性测量3.3.2 自定义固有特性测量3.4 …

ACCESS 用普通按钮控制导航窗体-子窗体中的显示目标

Forms!控制面板!NavigationSubform.SourceObject = "目标窗体"注: 在导航窗体的属性面板中不会显示SourceObject属性,但它是真实存在的.

ECMA标准ECMAScript(JavaScript的一个标准)和C#

2024 年 6 月 26 日,第 127 届 ECMA 大会正式批准了 ECMAScript 2024 语言规范,这意味着它现在正式成为最新 ECMAScript 标准。ECMAScript是ECMA标准中最著名的编程语言标准,它定义了JavaScript语言的核心特性。C#语言则是由ECMA国际组织制定的编程语言标准,目前最新的版本…

CAD、GIS与Three.js如何完美结合,实现2D与3D数据可视化的无限可能

CAD、GIS与Three.js是热门的三大软件或技术,如何将三都完美结合起来,实现2D与3D数据可视化的无限可能呢?现状 AutoCAD是全球最流行的CAD软件之一,其生成的DWG文件格式已经成为二维绘图的事实标准格式。然而,由于AutoCAD使用的是私有文件格式,这些文件只能在支持该格式的C…

HSQL 数据库介绍(2)--使用

本文主要介绍 HSQLDB 的基本使用,文中所使用到的软件版本:Java 11.0.22、HSQLDB 2.7.2。 1、进程内模式 直接使用 JDBC 连接数据库即可,如果数据库不存在会自动创建。 1.1、file 数据库@Test public void inProcessFile() throws SQLException {String dbName = "test&…

Tita的OKR:高端制造行业的OKR案例

高端设备制造行业的发展趋势:产业规模持续扩大:在高技术制造业方面,航空、航天器及设备制造业、电子工业专用设备制造等保持较快增长。新能源汽车保持产销双增,新材料新产品生产也高速增长。 标志性装备不断突破:例如,火电机组、核电机组和水电机组单机容量均超百万千瓦,…

Deepfake Day1:Baseline解读

Deepfake Deepfake是一种使用人工智能技术生成的伪造媒体,特别是视频和音频 深度伪造技术(Deepfake)主要可以分为以下几个研究方向:面部交换:专注于在两个人的图像之间执行身份交换。 面部重演:强调转移源运动和姿态。 说话面部生成:专注于在角色生成中实现口型与文本内…

Blog记录

2024-07-13 博客建立 2024-07-14 博客快照

【Unity】自制PolygonCollider2D

防止和UnityEngine的PolygonCollider2D重名,所有类包裹在了我自己定义的名称空间JimDevPack中,名称空间的声明部分在文章代码中略去了。定义PolygonCollider2D和基类 基类 public class Collider2D : MonoBehaviour {}PolygonCollider2D public class PolygonCollider2D : Co…

C++11 标准库 线程库thread梳理

目录<thread>this_thread命名空间1. get_id()2. sleep_for()3. sleep_until()4. yield()thread类构造函数:类方法1. get_id()2. join()3. detach()4. joinable()5. operator=6. hardware_concurrency(static)多线程的两种计算场景 <thread> this_thread命名空间 在…

大模型中的tempture以及top-p问题

原文:https://blog.csdn.net/jarodyv/article/details/128994176 参考:https://blog.csdn.net/engchina/article/details/138258047 为了使大模型的生成和表达更加多样,GPT采用了tempture以及top-p方法。 GPT的输出层后面一般跟着softmax,在判别式模型中我们会输出概率最高…

Java基础04:数据类型拓展

整型拓展 十进制整数,如:99, -500, 0。 八进制整数,要求以 0 开头,如:015。 十六进制数,要求 0x 或 0X 开头,如:0x15 。 //整型 int i=10; int i2=010; int i3=0x10; System.out.println(i); //10 System.out.println(i2); //8 System.out.println(i3); //16浮点型拓展…