.net中close和dispose及关闭流操作

简介:

 之前打开文件流后总不记得关闭流,昨天终于出现问题了,因此上网搜了一下,下面是实际操作和网上搜索后的记录:

1.关闭流的顺序一般为后开先关,如

Image img = Image.FromFile("file.jpg"); 
MemoryStream ms = new MemoryStream();
img.Save(ms, ImageFormat.Jpeg);
ms.Close();
ms.Dispose();
img.Dispose();
其实不用如此。因为是深拷贝,所以ms和img之间已经没有联系了,两个对象是以不同的形式操作同一个文件,所以先关闭哪一个都没关系。下面的例子可以证 明一个对象关闭了,而另一个对象依然可以操作该文件。注意这两个对象属于同一个进程来操作文件,所以不会产生IOException。
Image img = Image.FromFile("file.jpg");   
MemoryStream ms = new MemoryStream();
img.Save(ms, ImageFormat.Jpeg);
img.Dispose();  
context.Response.OutputStream.Write(ms.GetBuffer(), 0, (int)ms.Length);
ms.Close();
ms.Dispose();

而如果是其他进程的流操作文件时,之前操作文件的流却没释放所有资源的话,会抛出IOException。

2..NET中有些非托管对象有Close和Dispose,有些只有Dispose,网上有的说Close是Dispose的显式实现,会调用 Dispose。不过我曾试过只调用Close然后用另一个进程的试图打开该文件,居然抛出IOException;但如果只调用Dispose就一切正 常。然后网上又有说Close只是关闭连接,Dispose是释放相关的所有资源。于是实际操作中存在Close和Dispose的情况下,先调用 Close然后再调用Dispose是最保险的做法。

3.之前一直以为非托管资源一定要程序员手动释放资源,但通过这次的机会上网看到资料说像FileStream对象实现了Finalize,里面就 释放了非托管对象,当垃圾回收时就会自动释放资源,当然这样效率不高只是防止内存泄露的保底做法。而垃圾回收的发生时间为(1)内存不足的时候(这里还有 哪一代区域的内存满了该如何操作的问题,详细请看.Net垃圾回收机制),(2)调用GC.Collect(),(3)程序域关闭就是AppDomain关闭(一个程序可以有多个程序域),(4)CLR关闭(就是程序关闭)。

相关文章
|
11月前
|
SQL 关系型数据库 MySQL
案例剖析:MySQL唯一索引并发插入导致死锁!
案例剖析:MySQL唯一索引并发插入导致死锁!
728 0
案例剖析:MySQL唯一索引并发插入导致死锁!
|
9月前
|
人工智能 安全 算法
CAMEL AI 上海黑客松重磅来袭!快来尝试搭建你的第一个多智能体系统吧!
掌握多智能体系统,🐫 CAMEL-AI Workshop & 黑客马拉松即将启航!
221 4
CAMEL AI 上海黑客松重磅来袭!快来尝试搭建你的第一个多智能体系统吧!
|
JavaScript Java 测试技术
基于微信小程序的医院体检管理系统的设计与实现(源码+lw+部署文档+讲解等)
基于微信小程序的医院体检管理系统的设计与实现(源码+lw+部署文档+讲解等)
154 0
|
11月前
|
监控 Dubbo Java
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
这篇文章详细介绍了如何将Spring Boot与Dubbo和Zookeeper整合,并通过Dubbo管理界面监控服务注册情况。
768 0
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
|
XML Android开发 UED
💥Android UI设计新风尚!掌握Material Design精髓,让你的界面颜值爆表!🎨
随着移动应用市场的蓬勃发展,用户对界面设计的要求日益提高。为此,掌握由Google推出的Material Design设计语言成为提升应用颜值和用户体验的关键。本文将带你深入了解Material Design的核心原则,如真实感、统一性和创新性,并通过丰富的组件库及示例代码,助你轻松打造美观且一致的应用界面。无论是色彩搭配还是动画效果,Material Design都能为你的Android应用增添无限魅力。
281 1
|
SQL 关系型数据库 索引
关系型数据库SQLserver删除现有列
【8月更文挑战第4天】
347 9
|
C# Windows
WPF技术之Menu控件
WPF(Windows Presentation Foundation)是一种用于创建Windows应用程序的框架,而WPF Menu控件用于在应用程序中创建菜单。
388 0
|
JavaScript 前端开发 定位技术
最佳网络地图服务对比分析:Google Maps 与 OpenStreetMap
最佳网络地图服务对比分析:Google Maps 与 OpenStreetMap
827 0
最佳网络地图服务对比分析:Google Maps 与 OpenStreetMap
|
前端开发 算法 JavaScript
走进WPF之MVVM完整案例
走进WPF之MVVM完整案例
476 0
|
消息中间件 监控 算法
分布式定时任务框架选型
分布式定时任务框架选型