当前位置: 首页 > news >正文

.NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件

弱引用是 .NET 引入的概念,可以用来协助解决内存泄漏问题。然而事件也可能带来内存泄漏问题,是否有弱事件机制可以使用呢?.NET 没有自带的弱事件机制,但其中的一个子集 WPF 带了。然而我们不是什么项目都能引用 WPF 框架类库的。

本文介绍 Walterlv.WeakEvents 库来定义和使用弱事件。


本文内容

    • 下载安装 Walterlv.WeakEvents
    • 定义弱事件
    • 使用弱事件

系列博客:

  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .NET 设计一套高性能的弱事件机制

下载安装 Walterlv.WeakEvents

在你需要做弱事件的项目中安装 NuGet 包:

  • Walterlv.WeakEvents

定义弱事件

现在,定义弱事件就不能直接写 event EventHandler Bar 了,要像下面这样写:

using System;
using Walterlv.WeakEvents;

namespace Walterlv.Demo
{
    public class Foo
    {
        private readonly WeakEvent<EventArgs> _bar = new WeakEvent<EventArgs>();

        public event EventHandler Bar
        {
            add => _bar.Add(value, value.Invoke);
            remove => _bar.Remove(value);
        }

        private void OnBar() => _bar.Invoke(this, EventArgs.Empty);
    }
}

使用弱事件

对于弱事件的使用,就跟以前任何其他正常事件一样了,直接 +=-=

这样,如果我有一个 A 类的实例 a,订阅了以上 FooBar 事件,那么当 a 脱离作用范围后,将可以被垃圾回收机制回收。而如果不这么做,Foo 将始终保留对 a 实例的引用,这将阻止垃圾回收。


我的博客会首发于 https://blog.walterlv.com/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

知识共享许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://walterlv.blog.csdn.net/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

相关文章:

  • WPF 程序如何跨窗口/跨进程设置控件焦点
  • 使用 SetParent 制作父子窗口的时候,如何设置子窗口的窗口样式以避免抢走父窗口的焦点
  • WPF 程序如何移动焦点到其他控件
  • EFI 分区/恢复分区不可删除?你需要使用命令行了(配合鼠标操作)
  • EFI 分区/恢复分区不可删除?你需要使用命令行了(全命令行操作)
  • 使用傲梅分区助手无损合并分区,无损调整分区大小
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • Windows 系统上用 .NET/C# 查找所有窗口,并获得窗口的标题、位置、尺寸、最小化、可见性等各种状态
  • 直击本质:WPF 框架是如何实现模态窗口的
  • 什么是模态窗口?本文带你了解模态窗口的本质
  • 使用 .editorconfig 配置 .NET/C# 项目的代码分析规则的严重程度
  • 如何在 .NET 项目中开启不安全代码(以便启用 unsafe fixed 等关键字)
  • WPF 高性能位图渲染 WriteableBitmap 及其高性能用法示例
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • 使用 Direct3D11 的 OpenSharedResource 方法渲染来自其他进程/设备的共享资源(SharedHandle)
  • 4个实用的微服务测试策略
  • Angularjs之国际化
  • cookie和session
  • JavaScript-Array类型
  • Sass 快速入门教程
  • Webpack 4 学习01(基础配置)
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 基于HAProxy的高性能缓存服务器nuster
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 微信小程序实战练习(仿五洲到家微信版)
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 鱼骨图 - 如何绘制?
  • puppet连载22:define用法
  • ​第20课 在Android Native开发中加入新的C++类
  • (175)FPGA门控时钟技术
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (分类)KNN算法- 参数调优
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (汇总)os模块以及shutil模块对文件的操作
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET单元测试
  • @SuppressLint(NewApi)和@TargetApi()的区别
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例
  • [⑧ADRV902x]: Digital Pre-Distortion (DPD)学习笔记
  • [AIGC] 使用Curl进行网络请求的常见用法
  • [Android Pro] android 混淆文件project.properties和proguard-project.txt
  • [BeginCTF]真龙之力
  • [Excel VBA]单元格区域引用方式的小结
  • [HDU]2161Primes
  • [JS入门到进阶] 7条关于 async await 的使用口诀,新学 async await?背10遍,以后要考!快收藏
  • [k8s系列]:kubernetes·概念入门
  • [Loadrunner参数化]一个文件输两列参数的取值
  • [Oh My C++ Diary]#ifndef / #define / #endif 使用详解
  • [Oh My C++ Diary]类继承和类组合(内嵌类)初始化的不同
  • [poj2891]Strange Way to Express Integers(扩展中国剩余定理)