.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关闭(就是程序关闭)。

时间: 2024-08-01 20:02:50

.net中close和dispose及关闭流操作的相关文章

io-dom4j中因为输出流未正确关闭,导致再次获取单例模式的document时,对象为null

问题描述 dom4j中因为输出流未正确关闭,导致再次获取单例模式的document时,对象为null 一:如下是获取单例模式的document对象. private static Document returndoc(Document docuname, String xmlname) { if (docuname != null) { return docuname; } SAXReader reader = new SAXReader(); // 如果不存在就创建对象. try { docu

C/S程序中,客户端接收二进制内存流如何释放?急求...

问题描述 C/S程序中,我在客户端接收服务器端发来的MemoryStream数据.定义://获取网络流NetworkStreamnetworkStream=client.GetStream();//将网络流作为二进制读写对象br=newBinaryReader(networkStream);调用线程:privatevoidReceiveData(){stringreceiveString=null;while(isExit==false)//进入循环接收{try{receiveString=br

C++中输入输出流及文件流操作总结_C 语言

本文实例为大家分享了C++中输入输出流及文件流操作笔记,供大家参考,具体内容如下 1.流的控制     iomanip          在使用格式化I/O时应包含此头文件.     stdiostream   用于混合使用C和C + +的I/O机制时,例如想将C程序转变为C++程序 2.类继承关系 ios是抽象基类,由它派生出istream类和ostream类, iostream类支持输入输出操作,iostream类是从istream类和ostream类通过多重继承而派生的类 类ifstrea

SQL Server误区:即时文件初始化特性可以在SQL Server中 a)开启 和 b)关闭

误区 #3: 即时文件初始化特性可以在SQL Server中 a)开启 和 b)关闭 a)是不允许的  b)是允许的 即时文件初始化是一个在SQL Server 2005以及之上的版本鲜为人知的特性.这个特性允许数据文件(仅仅是数据文件,不包括日志文件)初始化的过程跳过填0初始化过程.这种方式是在发生灾难时大大减少Downtime的好办法---在恢复数据库时由于免去了填0初始化的过程而直接开始恢复过程. 我之前已经写过关于即时文件初始化误区的文章了(见Misconceptions around

360安全卫士中开机小助理怎么关闭

  360安全卫士中开机小助理怎么关闭 默认情况下,360开机小助手是不需要设置的,只要您安装了360安全卫士,它就会自动在开机的时候显示在电脑右下角哦,如果360开机小助手不见了,请按照下边的方法启用. 360开机小助手怎么打开和关闭 1.首先,确定您的电脑上安装了360安全卫士,如果没有安装,请先下载. 2.在桌面上找到360安全卫士图标(或双击右下角的360图标)打开360,然后在右上角点击设置. 3.接下来,在弹出的设置对话框中,找到[开机小助手]选项,根据需要打开或关闭开机小助手就可以

电脑中玩DNF时如何关闭左上角直播窗口

  电脑中玩DNF时如何关闭左上角直播窗口          1.首先打开安装路径下的startCrossApps; 2.然后找到以下两个文件夹,并将其删除即可,注意要先退出游戏再删除. 电脑中玩DNF时如何关闭左上角直播窗口

link中如何实现自定义的数据流,并且实现标准的流操作,就像filestream一样?

问题描述 link中如何实现自定义的数据流,并且实现标准的流操作,就像filestream一样? link中如何实现自定义的数据流,并且实现标准的流操作,就像filestream一样? 解决方案 从Stream这个抽象基类继承就可以了.https://msdn.microsoft.com/zh-cn/library/system.io.stream.aspx

为什么drop table 后数据还存在在数据字典中(10g 回收站已关闭)

问题描述 为什么drop table 后数据还存在在数据字典中(10g 回收站已关闭) 为什么drop table 后数据还存在在数据字典中(10g 回收站已关闭)?是否有等待?如何证明有堵塞?

android-Android中的adb进程是否关闭的或者如何关闭的问题

问题描述 Android中的adb进程是否关闭的或者如何关闭的问题 [2013-10-10 15:26:25 - adb] ADB server didn't ACK [2013-10-10 15:26:25 - adb] * failed to start daemon * [2013-10-10 15:30:05 - adb] ADB server didn't ACK [2013-10-10 15:30:05 - adb] * failed to start daemon * eclips