C# Dispose模式

目的

71ceb0414694189116b0b6d4f656f337.png

为了及时释放宝贵的非托管资源和托管资源,并且保证资源在被 gc 回收的时候可以正确释放资源,同时兼顾执行效率。

必须遵循的事实

fc23d38f65aa299953b777a8ef9f4183.png

1 .  托管资源释放:
  由另一线程的 gc 进行释放,当托管的对象没有被引用时,就会在“适当的时候”进行回收。
  如果定义了析构函数,回收的时候会调用析构函数(实际执行可能有差别),之后释放对象占用的内存。
  当类有析构函数时, gc 会分分两步来释放,如果没有析构函数或者指定不需要调用析构函数时,只需要一步就能释放。

2.  非托管资源必须显式释放

方案

c4d016a869ee4af3cb7630b722bb1b60.png

1.  把资源释放都放在析构函数里

可以保证资源都释放,但是由于 gc 调用时机的不确定性,导致宝贵的非托管资源无法及时释放。

2.  写个释放函数,手动是调用

如果忘了释放的话, 托管资源会被 gc 释放,但非托管资源就无法释放

3.  Dispose 模式。参考下面的代码

手动调用Dispose() 可以释放所有资源,并且在 gc 标记不需要再调用析构函数,从而提高了效率。如果忘记调用Dispose(), 则当 gc 调用析构函数的时候也会把非托管资源释放掉。

参考代码

4b76dcf76a57fa2806541eef284b07ad.png

public interface IDisposable
{void Dispose();
}
public class DisposablClass : IDisposable
{//是否回收完毕bool _disposed;public void Dispose(){Dispose(true);GC.SuppressFinalize(this); //标记gc不在调用析构函数}~DisposableClass(){Dispose(false);}private void Dispose(bool disposing){if(_disposed) return; //如果已经被回收,就中断执行if(disposing){//TODO:释放本对象中管理的托管资源}//TODO:释放非托管资源_disposed = true;}
}

可能存在的疑问

d06c4ac198e8f903bac28f5cd939864b.png

a4144926e9708e74d0ffdc9d2fa540ab.png

既然 gc 是另外一线程执行的,为什么Dispose(bool)函数里不加锁?

90aa7a694027325e8d7d234d9c386574.png

因为如果可以主动调用的时候,肯定此对象不是死对象,也不会被回收,因此不会同时调用到哪里不太对,但又说不上来。

a71f787cbdafd9f83eb7c85449087c1a.png

2b32cc8b4596cfcab9497e085835784b.png

7b618af3b96c142b27e21bf19050540b.png

outside_default.png

outside_default.png

outside_default.png

为什么析构函数调用的dispose(false)不释放托管资源?

outside_default.png

outside_default.png

outside_default.png

outside_default.png

因为析构函数由 gc 来调用,gc 会依次释放所有的死对象(不可到达),释放的顺序是随机的,如果在一个对象的析构里调用了一个本次 gc已经释放的对象,就会发生释放两次的错误。

outside_default.png

outside_default.png

outside_default.png

c3356ec46211f29c950d6c31e8faa70b.png

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

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

相关文章

在ASP.NET项目中使用CKEditor +CKFinder实现图片上传功能

前言 之前的项目中一直使用的是FCKeditor,昨天突然有个想法:为什么不试一下新的CKEditor呢?于是花了大半天的时间去学习它的用法,现在把我的学习过程与大家分享一下。 谈起FCKeditor,相信没几个Web程序员不知道的吧。不…

linux之内核剖析

Linux 内核简介 现在让我们从一个比较高的高度来审视一下 GNU/Linux 操作系统的体系结构。您可以从两个层次上来考虑操作系统,如图 2 所示。 图 2. GNU/Linux 操作系统的基本体系结构 上面是用户(或应用程序)空间。这是用户应用程序执行的地…

linux笔记 3-4 SMTP,.配置电子邮件传输

***************4.配置电子邮件传输*****************##1.基本电子邮件配置##配置dns服务,添加MX记录两台服务器分别配置 /etc/postfix/main.cf文件myhostname--主机名mydomain--域名myorigin--重写本地发布的电子邮件,使其显示为来自该域。这样有助于确保响应返回入…

希尔排序算法的实现

希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。 希尔排序实质上是一种分组插入方法。它的基本思想是:对于n个待排序的数列,取一个小于…

linux c之信号signal处理机制

最近同事的程序设计过程中用到了Linux的signal机制,从而引发了我对Linux中signal机制的思考。Signal机制在Linux中是一个非常常用的进程间通信机制,很多人在使用的时候不会考虑该机制是具体如何实现的。signal机制可以被理解成进程的软中断,因…

技术分享 | 微服务模式下如何高效进行API测试

导读:微服务架构下,API 测试的最大挑战来自于庞大的测试用例数量,以及微服务之间的相互耦合。基于这种挑战,如何进行高效的API测试,选择什么样的方式就比较重要,此文主要是采用契约测试的方法来对微服务模式…

由CloudStack项目引起的ESXI嵌套虚拟化引起的二级虚拟机无法被访问

关于这个问题,主要以文字描述为主,最终解决方法其实就一个步骤。问题描述:某客户需要部署某企业的云平台,但是由于年前没有足够的物理机资源,所以提供的资源均为虚拟机,现在让我们做技术评估。其实观察整个…

美女的床真的好难爬......

1 地中海式茂密?▼2 阴着呐▼3 拜拜了您呐▼4 草莓从哪里来▼5 爷青结系列▼6 没点才艺还住不了酒店了▼7 美女的床果真很难爬(真从500平大床中醒来)▼8 数学能有多有趣▼你点的每个赞,我都认真当成了喜欢

控制器方法错误处理

错误处理一直是开发维护阶段需要重点关注的一块,控制器中方法原则上都需要处理错误。 1、添加BaseController 路径:nweb\src\main\java\com\nankang\cati\nweb\controller\BaseController.java 所有的控制器都继承BaseController 2、使用: 1&…

EF Core 6 新功能汇总(一)

在这篇文章中,你将看到 EF Core 6 中的十个新功能,包括新的特性标注,对时态表、稀疏列的支持,以及其他新功能。1Unicode 特性在 EF Core 6.0 中,新的 UnicodeAttribute 允许你将一个字符串属性映射到一个非 Unicode 列…

DS5020配置集群存储

一、方案设计 计划给某公司服务器制作集群,存储划分大致如下: 1、 将存储磁盘制作为raid5; 2、 划分两个Storage Partition给两类集群使用,一类为数据库服务,一类为各种应用服务 二、存储的连接 1、存储的简介 Serial …

RequireJS首次加载偶尔失败

现象:第一次加载JS文件,首次加载偶尔失败; 原因:require([jquery, operamasks, zTree, jQueryCookie],中前后引用同步加载; 解决方式:shim声明前置加载; 配置如下: requi…

linux之file命令总结

解释: file是通过查看文件的头部内容,来获取文件的类型使用file命令可以知道某个文件究竟是二进制(ELF格式)的可执行文件, 还是Shell Script文件,或者是其它的什么格式。 file能识别的文件类型:目录、Shel…

优化.NET 应用程序 CPU 和内存的11 个实践

https://michaelscodingspot.com/cpu-bound-memory-bound/优化.NET 应用程序 CPU 和内存的11 个实践凡事都有其限度,对吧?汽车只能开这么快,进程只能使用这么多内存,程序员只能喝这么多咖啡。我们的生产力受到资源的限制&#xff…

陈省身:三角形内角和不等于180°

全世界只有3.14 % 的人关注了爆炸吧知识三角形外角和为360作为公认的劳模,平日里,超模君不但要码字,工作之余还要监督表妹做作业,也难怪表妹成绩总是能名列前茅。今天表妹做作业时,遇到一道判断题:“三角形…

跟我学PHP第二篇- 配置Mysql以及PHP WampServer篇(1)

大家好,昨天我给大家介绍了如何去安装ZEND STUDIO,下面昨天文章的链接: http://www.cnblogs.com/kmsfan/p/zendStudio.html 本节为配置的第一部分,还没有讲完全部,因为个人工作比较忙,没有一整天时间写博客…

linux之查看文件大小和磁盘大小总结

1 、查看文件大小 使用du命令,查看该目录以及子目录文件的大小 du -h 如果只需要快速查看这个目录占用大小,可用下面命令 du -sh 比如我们查看xiaoyun这个文件大小 2、查看电脑磁盘大小 使用下面命令 df -h 效果如下图 很明显系统装载/dev/sda2下

YARP(Yet Another Reverse Proxy)是使用 .NET 构建的高度可定制的反向代理

点击上方蓝字关注我们(本文阅读时间:16分钟)YARP 1.0已经发布了,现在可以从 NuGet 下载。YARP(Yet Another Reverse Proxy)是使用 .NET 构建的高度可定制的反向代理。YARP 与其他反向代理的最大区别在于它是如何构建和…