用IDisposable接口释放.NET资源

2016-01-29 13:26 7 1 收藏

用IDisposable接口释放.NET资源,用IDisposable接口释放.NET资源

【 tulaoshi.com - ASP.NET 】

使用Dispose 模式能够适当地释放资源,但会增加系统开销。by Mickey Williams 通过使用Dispose模式可以适当地释放非内存资源,比如数据库连接、Win32 interop组件和操作系统的句柄。你不要指望垃圾收集器能够立即将资源释放掉,因为垃圾收集器是由于管制堆(Managed Heap)的内存紧张时才触发的。你可以快速消耗掉例如数据库连接等少量资源,但会给程序的扩展性造成副面影响。在不必要的时候不能实现Dispose模式,因为它可能会增加系统开销,而这在很多情况下是可以避免的。在.NET当中Dispose 模式是由一个IDisposable接口来实现的,它包括一个简单的方法--Dispose: interface IDisposable{ void Dispose();} 最明显的例子是在一个类里当类的实例抢占住一个非管制资源(unmanaged resource)时必须实现IDisposable,比如一个本地数据连接或是操作系统的句柄。另外,记下一个经常被忽略的应该实现IDisposable接口的例子。当一个类实现IDisposable时,实例的正确用法是当对象不在需要时调用Dispose方法删除它,因此,在你实现一个类,而该类又包含其他实现IDisposable的类时,必须调用Dispose方法。这通常意味着在该类中你必须实现IDisposable,即使它无法直接处理非管制资源。以下是一个实现IDisposable接口的典型模式: public class SlalomRacer: IDisposable{ bool _disposed = false; public bool IsDisposed { get { return _disposed; } set { _disposed = value; } } ~SlalomRacer() { InternalDispose(false); } public void Dispose() { InternalDispose(true); } protected void InternalDispose(bool disposing) { if(disposing) { GC.SuppressFinalize(this); _managedThing.Dispose(); } _unmanagedThing.Dispose(); } [...]}在前面的代码片断中,当IDisposable被实现时,可以通过两种方法调用disposal代码。首先,如果你直接调用Dispose方法,所有管制和非管制对象均会被列为被清除目标。可以看到终止操作会执行一个阻止对象被清除掉的优化的步骤。还注意到可以安全地多次调用Dispose方法。调用dispose方法之后,会使用一个标志来确保这个对象上的任何一个方法都不能被调用,示例代码如下: public void SeekHotTub(){ if(IsDisposed) throw new ObjectDisposedException("BT");}ObjectDisposedException会提醒你前面已经使用了一个disposed对象。在一个使用过disposed对象上调用其他方法时引发异常是完全有必要的--毕竟,你不能再次使用这些disposed对象。其次,如果你不调用这个Dispose方法,终止操作会自己调用Dispose(false),它会采用一个和前段代码稍有不同的代码路径。第一,不清除那些管制对象,即使他们也实现了IDisposable接口。你无法确定对象引用是有效的--这些对象可能在等待操作的终止,或者已经被终止了。第二,也没有必要去调用GC.SuppressFinalization,因为这些对象已被终止使用了。最后,如果你在使用C#,你应该利用其语言固有的对IDisposable接口的支持来实现对象清除,你可以使用以下声明: using(SlalomRacer mickey = new SlalomRacer()){ // use mickey here mickey.RunGates(); mickey.GetStitches();}// mickey disposed automatically hereC#编辑器会适当地发出调用Dispose方法的IL代码,即使会引发异常。

来源:http://www.tulaoshi.com/n/20160129/1490198.html

延伸阅读
  .NET 提供的反射(Reflection)机制可以很方便的加载插件。本文提供一种方法,可以灵活的正确的载入所需的插件。 在.NET中,一个完整的类型名称的格式如 "类型名, 程序集名"。 例如:"System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"。 类型名为:System...
我认为我认识的人中没有一个人完全理解.NET。我们仍然试着用.NET武装我们的头脑,这有几个原因,它是巨大的、新的、综合的,但我认为最重要的原因是.NET要求IT从业者了解在他们的传统工作之外所发生的事情。管理人员必须知道架构人员在做什么。架构人员需要知道开发人员有什么开发工具。项目管理人员需要知道所有的事情。这就是.NET 杂志 的目...
标签: 真龙霸业 手游
真龙霸业怎么获取资源 在真龙霸业手游中,游戏资源是一个非常重要的玩法,合理利用资源可以提高玩家的综合实力,当然了,也有许多中获取资源的方式,只不过是快慢的问题,不急的话可以自给自足,急着用的话就去购买其他玩家手里的资源吧。 最基本且最稳妥的资源获取方式是在城外建设大量的农田等建筑,记得及时领取所产资源,否则到达容量上...
BASIC语言历史悠久,近年来发展迅速。BASIC语言的结构化程度高,易于理解,很适合广大的编程人员使用。而第三代BASIC语言的功能更是日臻完善、强大,使用人员更多。 本文意在向编程经验不十分丰富的读者介绍用BASIC语言设计Windows风格的图形用户接口,起一点抛砖引玉的作用,不妥之处望不吝赐教。程序 在VGA(用Screen12语句设置)方式下...
import java.lang.reflect.Field; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.swt.graphics.Image; /**  * @author house *  * TODO 要更改此生成的类型注释的模板,请转至  * 窗口 - 首选项 - Java - 代码样式 -...

经验教程

642

收藏

80
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部