C#回收机制之资源回收托管
作者:農碼一生 发布时间:2022-03-04 13:18:20
标签:C#,回收,机制,资源,托管
一、常见非托管资源
Windows窗口句柄、数据库链接、GDI对象、独占文件锁等等对象
ApplicationContext,Brush,Component,ComponentDesigner,Container,Context,Cursor
FileStream,Font,Icon,Image,Matrix,Object,OdbcDataReader,OleDBDataReader,Pen
Regex,Socket,StreamWriter,Timer,Tooltip
二、实现原理
定义类继承IDisposable
接口
public class DisposeTest : IDisposable
{
//实现IDisposable接口方法
public void Dispose()
{
}
}
在类中定义资源和方法
public class DisposeTest : IDisposable
{
#region Dispose经典实现方式
//实现IDisposable接口方法
public void Dispose()
{
Dispose(true);//调用处理方法
GC.SuppressFinalize(this);//让GC忽略
}
//资源
private readonly IntPtr unmanagedResource;//非托管内存
private readonly SafeHandle managedResource;//托管资源
//构造方法初始化资源
public DisposeTest()
{
unmanagedResource = Marshal.AllocHGlobal(sizeof(int));//分配非托管内存
managedResource = new SafeFileHandle(new IntPtr(), true);//创建托管资源
}
//根据不同资源进行处理
protected virtual void Dispose(bool isManualDisposing)
{
ReleaseUnmanagedResourse(unmanagedResource);//处理非托管资源
if (isManualDisposing)
{
ReleaseManagedResources(managedResource);//处理托管资源
}
}
private void ReleaseUnmanagedResourse(IntPtr intPtr)
{
Marshal.FreeHGlobal(intPtr); //释放非托管内存
}
private void ReleaseManagedResources(SafeHandle safeHandle)
{
if (safeHandle != null)
{
safeHandle.Dispose(); //释放托管资源
}
}
//析构函数处理托管资源
~DisposeTest()
{
Dispose(false);
}
#endregion
}
三、Close()和Dispose()区别
lose()方法关闭对象,没有完全释放。Dispose()方法完全释放了
一般情况,Close() 实现了接口对Dispose()的封装,调用时不需要直接调用Dispose()
四、常见封装的语法写法
Close()方法
SqlConnection conn3 = new SqlConnection();
try
{
conn3.Open();
}
catch (Exception)
{
throw;
}
finally
{
conn3.Close();//关闭对象
}
using()
using (SqlConnection cnn = new SqlConnection())
{
//此处使用,使用完后系统会自动释放
}
Dispose()
SqlConnection cnn2 = new SqlConnection();
try
{
//这里写要执行的代码
}
finally
{
cnn2.Dispose();
}
来源:https://www.cnblogs.com/wml-it/p/16081656.html
0
投稿
猜你喜欢
- Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。 1.方法声明时使
- 前言本篇文章主要介绍的是SpringBoot项目进行全局异常的处理。SpringBoot全局异常准备说明:如果想直接获取工程那么可以直接跳到
- 前言好久没有更新博客了,今天和大家分享一个关于emoji表情持久化问题,相信做web开发的都遇到过这样的问题,因为我们知道mysql的utf
- 1.以ApplocationContext上下文单例模式装配bean为例,深入探讨bean的生命周期:(1).生命周期图:(2).具体事例:
- 一、创建maven项目我使用的是汉化的idea可以选择原型,我这里没有选择输入项目名称,完成创建二、配置tomcat选择运行编辑配置点加号找
- springboot跳转到指定页面controller的写法必须是templates下面的页面,不经过配置,无法直接跳转到public,st
- 最新的IDEA激活方式使用网上传统的那种输入网址的方式激活不了,使用http://idea.lanyus.com/这个网站提供的工具进行1、
- 代码如下:try { // 创建一个线程 Thread thread = new Thread() {
- springcloud eureka切换nacos配置中心地址: http://10.166.9.7:8848/nacos/bootstra
- 整理文档,搜刮出一个java后台接受app上传的图片的示例代码,稍微整理精简一下做下分享package com.sujinabo.file;
- 本文实例讲述了C#采用HttpWebRequest实现保持会话上传文件到HTTP的方法,在项目开发中有一定的实用价值,具体方法如下:一、前言
- 本文实例为大家分享了Java实现多任务执行助手的具体代码,供大家参考,具体内容如下1.多线程执行任务类package com.visy.th
- SpringBoot启动yaml报错报错找不到org.yaml里的一个方法10:45:54.742 [main] ERROR org.spr
- 嵌套查询使用Fluent Mybatis, 不用手写一行xml文件或者Mapper文件,在dao类中即可使用java api构造中比较复杂的
- Spring Security登录表单配置1.引入pom依赖创建一个Spring Boot工程,引入Web和Spring Security依
- Android基础教程数据存储之文件存储将数据存储到文件中并读取数据1、新建FilePersistenceTest项目,并修改activit
- 右击有main方法的类===> Run as===> Run Configurations ===>双击java
- 有段时间没有写博客了,也在努力的从传统单机开发向分布式系统过度,所以再次做一些笔记,以方便日后查看。直接进入正题吧,今天记录spring-b
- 一、SpringBoot中的main方法注入service在springboot中使用main方法常规无法注入service,因为以后也可能
- 不知道大家对千篇一律的404 Not Found的错误页面是否感到腻歪了?其实通过很简单的配置就能够让Spring MVC显示您自定义的40