首页
学习
活动
专区
圈层
工具
发布

.NETC# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)

弱引用是 .NET 引入的概念,可以用来协助解决内存泄漏问题。然而事件也可能带来内存泄漏问题,是否有弱事件机制可以使用呢?.NET 没有自带的弱事件机制,但其中的一个子集 WPF 带了。...(可让任意 CLR 事件成为弱事件) .NET 设计一套高性能的弱事件机制 场景与问题 了解一下场景,你就能知道这是否是适合你的方案。...即使你已经不再引用这个类型的任何一个实例,此实例也会被 _watcher 的事件引用着,而 FileSystemWatcher 的实例也因为 EnableRaisingEvents 而一直存在。...下载安装 Walterlv.WeakEvents 在你需要做弱事件的项目中安装 NuGet 包: Walterlv.WeakEvents 编写自定义的弱事件中继 现在,我们需要编写一个自定义的弱事件中继类...如果你对弱事件的性能有要求,那么还是接受这些代码会比较好。 不要紧张,我来一一解释这些代码。

44130

.NET 设计一套高性能的弱事件机制

弱引用是 .NET 引入的概念,可以用来协助解决内存泄漏问题。然而事件也可能带来内存泄漏问题,是否有弱事件机制可以使用呢?.NET 没有自带的弱事件机制,但其中的一个子集 WPF 带了。...设计原则 支持为任意类型的事件添加弱事件支持,而不只是自己定义新事件的时候可以使用(对标主流 NuGet 包和 StackOverflow 上的回答) 具有很高的性能(对标主流的 NuGet 包和 WPF...泛型版本的 WeakEventManager) 类的使用者只需要编写极少量的代码就能完成(对标 WPF 非泛型版本的 WeakEventManager) 这三个原则,从上到下优先级依次降低。...API 设计 对于 API 的设计,我有一个小原则: 如果技术实现很难,那么 API 迁就技术实现;如果技术实现很容易,那么技术迁就 API 我总结了好的 API 设计的一些原则: 好的框架需要好的 API...所以,构造函数需要传入事件源。 最后的问题 最后还留下了一个问题 订阅者现在确实“弱事件”了,但这个“中继”怎么办?可是被强引用了啊? 虽然中继的类实例小得多,但这确实依然也是泄漏,因此需要回收。

48920
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    文件和文件夹不存在的时候,FileSystemWatcher 监听不到文件的改变?如果递归地监听就可以了

    如果递归地监听就可以了 2018-12-20 02:05 当你需要监视文件或文件夹的改变的时候,使用 FileSystemWatcher 便可以完成...不过我把它写出来是因为如果我不说,可能有些小伙伴原本简单的问题就会变得复杂化。...需要说明的是,FileSystemWatcher 原本是监视文件夹的,第一个参数是监视的文件夹的路径,而第二个参数是监视文件或文件夹的过滤通配符。...} 完整的代码和使用方法 由于代码还是有一点点多。如果放到你原有的业务当中,对你的业务代码确实是一种污染。所以我封装了一个类 FileWatcher。...欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://blog.walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布

    1.7K20

    ASP.NET MVC模块化开发——动态挂载外部项目

    ,WebForm项目只需要挂在虚拟目录拷贝dll就可以访问,但是MVC不可能去引用工程项目的dll重新编译,从而产生了开发一个动态挂在MVC项目功能的想法,MVC项目挂载主要有几个问题,接下来进行详细的分析与完成解决方案...解决办法是通过AppDomain对业务项目dll独立加载,更新时进行卸载 1)创建一个RemoteLoader一个可穿越边界的类,作为加载dll的一个包装 public class RemoteLoader...,会有找不到相关dll的错误,同时这里也需要配置web.confg文件指定额外的dll搜索目录,因为业务工程代码也会有很多层多个dll相互引用,不指定目录也会存在找不到依赖dll的错误 的权限配置问题而放弃,我最后的解决方法是比较歪门邪道的方法,更新web.config文件的修改日期,因为iis会监控配置文件,更新了会重启引用...,大家如果有更好的简单的方法,可以评论回复我呦 //这里通过修改webconfig文件的时间达到重启应用,加载项目dll的目的!

    59530

    Nature | 我的研究对后人毫无用途:21%的学术论文自发布后从未被引用

    跟史密斯一样,许多科学家对自己的研究论文不被引用这一现象有深深执念:这体现了其学术影响力。...拉瑞维尔认为,这个更高的比率可能与许多这类论文的技术性本质相关,因为它们解决的是更具体的问题而不是为后来者的学术研究奠定理论基础。 学科和国家的差异 学科的差异对论文的引用也有很大影响。...他已经在2012年将自己的数据分析软件上传到了GitHub代码分享网站,这已经在几篇论文中被引用。但是,他说这个研究需要四年时间才能发表,主要是因为这涉及到一个同行评议者不理解的罕见问题。...2003年,Buurma及其同事发表了一篇关于“等容引发争议”的论文——关于在温度变化时,反应过程中阻止溶剂收缩或膨胀是否有用的争论。...Oliver Smithies在林道会议上发言时说,他已经认识到他1953年的论文的价值,即使这篇论文还未被引用。他对观众说,后面的工作帮助他获得了博士学位,成长为一名更成熟的科学家。

    1.1K60

    利用 C# 中的 FileSystemWatcher 制作一个文件夹监控小工具

    利用 C# 中的 FileSystemWatcher 制作一个文件夹监控小工具 独立观察员 2020 年 12 月 26 日 前一段看到微信公众号 “码农读书” 上发了一篇文章《如何使用 C# 中的 FileSystemWatcher...FileSystemWatcher 进行文件系统变更监测的方法,本人受此启发,决定制作一个文件夹内变动监控的小工具,当作练手和自用。...如果取消勾选 “是否显示完全路径”,则输出的信息中将不包含选择的 “文件夹路径” 部分,也就是显示的是相对路径。如果取消勾选 “是否监控子文件夹”,则程序将不监控子文件夹内的变动情况。.../// 开始监控目录 /// /// 目录路径 /// 是否包括子目录.../article/details/8469285)(里面也有个监控软件,不过我没下载,大家可以试试) 待更新:目前信息窗口信息多的话会触发 “灭霸模式”,后面考虑加个开关。

    1.3K10

    记一次 .NET 某风控管理系统 内存泄漏分析

    +AsyncReadState 吸引到了,毕竟被 System.IO.FileSystemWatcher 折腾多次了,它已经深深打入了我的脑海。。。...为做到严谨,我还是从最大的 System.Byte[] 入手,按size对它进行分组再按totalsize降序,丑陋的脚本我就不发了,直接上脚本的输出结果。 !...从输出结果看,size=8216 的 byte[] 有 48w 个,然后脚本也列出了一些 8216 大小的 address 地址,接下来用 !gcroot 看下这些地址的引用。 0:000> !...有了这些原理之后,接下来就可以问朋友是否有对 appsettings 设置了 reloadonchange=true 的情况,朋友找了下代码,写法大概如下: public object GetxxxFlag...三:总结 总的来说,设置 reloadOnChange: true 一定要慎重, 可能它会造成你的程序卡死,句柄泄漏,内存泄漏 等等!!! 改进方案我就不说了,参考我前面的系列文章吧。

    61450

    使用 .NET Core 3.0 的 AssemblyLoadContext 实现插件热加载

    一般情况下,一个 .NET 程序集加载到程序中以后,它的类型信息以及原生代码等数据会一直保留在内存中,.NET 运行时无法回收它们,如果我们要实现插件热加载 (例如 Razor 或 Aspx 模版的热更新...关于 AssemblyLoadContext 的介绍与实现原理可以参考 yoyofx 的文章 与 我的文章。...如果你用过 .NET Framework 的 AppDomain 机制可能会想是否需要 Marshalling 处理,答案是不需要,.NET Core 的可回收程序集会加载到当前的 AppDomain..._watcher; 这是管理插件的代理类,在内部它负责编译与加载插件,并且把对 IPlugin 接口的方法调用转发到插件的实现中。...,包括宿主程序集、System.Runtime 等,这个列表会在 Roslyn 编译插件时使用,表示插件编译时需要引用哪些程序集。

    5.2K30

    使用FileSystemWatcher监视文件变化

    ——这个属性告诉FileSystemWatcher它需要监控哪条路径。...IncludeSubDirectories——这个属性说明FileSystemWatcher对象是否应该监控子目录中(所有文件)发生的改变。     ...值得注意的是,这个事件可能会被提交多次,即使文件的内容仅仅发生一项改变。这是由于在保存文件时,文件的其它属性也发生了改变。     Created——当被监控的目录新建一个文件时,就提交这个事件。...问题:   程序里需要监视某个目录下的文件变化情况: 一旦目录中出现新文件或者旧的文件被覆盖,程序需要读取文件内容并进行处理;但在实际处理中发现当一个文件产生变化时,Change事件被反复触发了好几次。...这样可能的结果是造成同一文件的重复处理。 解决方法:   针对上面的问题,于是写了一个可以延迟FileSystemWatcher发出的事件的Class DelayFileSystemWatcher。

    1.3K10

    C# 监控 Windows 文件夹

    您是否为无法看到孩子在电脑上存储的图片而发愁,您是否为无法监控员工在电脑上存储的东西而发愁,那么今天给您推荐的这款产品绝对是您不二的选择,它是由美国大厂生产,完全符合国际标准的产品,完美支持 Windows...98 以上系统,他就是 FileSystemWatcher 牌监控仪。...OnCreated(FileSystemEventArgs) 在被监控的目录中创建文件或目录时将调用这个事件。这里需要注意的是虽然复制和移动并不是创建,但同样会触发这个事件。...IncludeSubdirectories:获取或设置是否监控被监控目录的子目录。 InternalBufferSize:内部缓冲区大小,最大为64K,默认为8K。...NotifyFilter:获取或设置哪些内容改变后需要被捕获,可设置的类型如下: 类型 说明 Attributes 文件或文件夹的属性 CreationTime 文件或文件夹的创建时间 DirectoryName

    1.1K10

    在C#使用文件监控对象FileSystemWatcher 实现数据同步

    首先想到的是用程序定期去访问这个文件,因为对实时性要求很高,间隔不能超过1S,而且每次获取到文本内容都要去分发给WEB服务器做别的操作,而那个文本的写入有时候会频繁,1秒可能多次,但是也有可能在相当长一段时间内是没有任何写入的...最终发现了c#中的FileSystemWatcher对象,在应用FileSystemWatcher之前,首先了解一下这个对象的基本属性和事件,首先普及一下FileSystemWatcher基本知识。...FileSystemWatcher基础 属性: Path——这个属性告诉FileSystemWatcher它需要监控哪条路径。...IncludeSubDirectories——这个属性说明FileSystemWatcher对象是否应该监控子目录中(所有文件)发生的改变。...事件处理 当FileSystemWatcher调用一个事件处理器时,它包含两个自变量——一个叫做“sender”的对象和一个叫做“e”的 FileSystemEventArgs对象。

    3.1K60

    文件系统:物理文件系统

    PhysicalDirectoryContents的Exists属性取决于指定的目录是否存在。...当我们调用该方法的时候,PhysicalFileProvider会通过解析我们提供的Globbing Pattern表达式来确定我们期望监控的文件或者目录,并最终利用FileSystemWatcher对象来对这些文件实施监控.../test/*.txt”),不论解析出来的文件是否存在于PhysicalFileProvider的根目录下,这些文件都不会被监控。...这是一个公共类型,如果我们具有监控物理文件系统变化的需要,可以直接使用这个类型。...最后需要提醒的是,当我们不再需要对指定目录实施监控的时候,记得调用PhysicalFileProvider的Dispose方法,该方法会负责将FileSystemWatcher对象关闭。

    1.9K50

    C++ Qt开发:QFileSystemWatcher文件监视组件

    它允许你在文件或目录发生变化时接收通知,并可以用于监视文件的创建、删除、重命名以及内容修改等操作。这对于需要实时监控文件系统变化的应用程序是非常有用的。...bool contains(const QString &path) const 检查监视器是否包含指定的文件或目录路径。...首先我们需要新增一个filesystem.h头文件,该类主要用于实现对文件访问的封装,其中addWatchPath用于增加一个被监控目录,当目录被更新世则调用directoryUpdated,文件被修改调用...当用户需要自定义功能时可以在信息输出前对特定目录做进一步处理以达到监视并控制特定文件的功能。....... } } }}同理,当文件被修改时则调用fileUpdated函数,只需要去除绝对路径与文件名即可,如下代码所示;void FileSystemWatcher

    1.6K10

    使用devtools导致的类型转换异常及Spring Devtools 源码初步解析

    ,我个人来讲的话想的有点偏,总觉得是序列换的问题,说来也是惭愧。...方法去启动一个fileSystemWatcher ,在启动fileSystemWatcher的时候会在fileSystemWatcher上注册一个ClassPathFileChangeListener监听用于响应监听的目录发生变动...客户端需要你手动来开启。 运行远程应用的客户端: 远程应用的客户端被设计成在你的IDE中运行。...远程更新: 客户端会监控你的classpath,和本地重启的监控一样。任何资源更新都会被推送到远程服务器上,远程应用再判断是否触发了重启。如果你在一个云服务器上做迭代,这样会很有用。...你需要首先确保你的远程应用启动时已经开启了debug模式。一般来说,可以设置JAVA_OPTS。

    1.6K30

    现在有一个非常庞大的数据,假设全是 int 类型。现在我给你一个数,你需要告诉我它是否存在其中(尽量高效)

    前言 最近有朋友问我这么一个面试题目: 现在有一个非常庞大的数据,假设全是 int 类型。现在我给你一个数,你需要告诉我它是否存在其中(尽量高效)。...我想大多数想到的都是用 HashMap 来存放数据,因为它的写入查询的效率都比较高。 写入和判断元素是否存在都有对应的 API,所以实现起来也比较简单。...而我们是否可以换种思路,因为只是需要判断数据是否存在,也不是需要把数据查询出来,所以完全没有必要将真正的数据存放进去。 伟大的科学家们已经帮我们想到了这样的需求。...它主要就是用于解决判断一个元素是否在一个集合中,但它的优势是只需要占用很小的内存空间以及有着高效的查询效率。 所以在这个场景下在合适不过了。...特别是需要精确知道某个数据不存在时做点什么事情就非常适合布隆过滤。 这段时间的研究发现算法也挺有意思的,后续应该会继续分享一些类似的内容。 如果对你有帮助那就分享一下吧。

    87020
    领券