强制回收和IDisposable.Dispose方法

如果某对象的 Dispose 方法被调用一次以上,则该对象必须忽略第一次调用后的所有调用。 如果对象的 Dispose 方法被多次调用,该对象一定不要引发异常。 除Dispose 之外的实例方法在资源已释放时会引发 ObjectDisposedException

用户可能期望资源类型使用特定的约定来表示已分配状态和已释放状态。流类即是这样一种示例,传统上认为它们要么打开要么关闭。具有此种约定的类的实施者可能选择实现具有自定义名称(如“Close”)的公用方法来调用 Dispose 方法。

因为 Dispose 方法必须显式进行调用,所以,实现 IDisposable 的对象还必须实现一个终结器,以便在未调用 Dispose 时处理释放资源问题。 默认情况下,垃圾回收器会在回收一个对象的内存之前自动调用该对象的终结器。然而,在调用 Dispose 方法后,通常不需要垃圾回收器调用已释放对象的终结器。 为防止自动终止,Dispose 实现可以调用 GC .SuppressFinalize方法。

强制垃圾回收

.NET Framework 2.0

  垃圾回收 GC 类提供 GC.Collect 方法,您可以使用该方法让应用程序在一定程度上直接控制垃圾回收器。通常情况下,您应该避免调用任何回收方法,让垃圾回收器独立运行。在大多数情况下,垃圾回收器在确定执行回收的最佳时机方面更有优势。但是,在某些不常发生的情况下,强制回收可以提高应用程序的性能。当应用程序代码中某个确定的点上使用的内存量大量减少时,在这种情况下使用 GC.Collect 方法可能比较合适。例如,应用程序可能使用引用大量非托管资源的文档。当您的应用程序关闭该文档时,您完全知道已经不再需要文档曾使用的资源了。出于性能的原因,一次全部释放这些资源很有意义。有关更多信息,请参见 GC.Collect 方法

  在垃圾回收器执行回收之前,它会挂起当前正在执行的所有线程。如果不必要地多次调用 GC.Collect,这可能会造成性能问题。您还应该注意不要将调用 GC.Collect 的代码放置在程序中用户可以经常调用的点上。这可能会削弱垃圾回收器中优化引擎的作用,而垃圾回收器可以确定运行垃圾回收的最佳时间。

http://msdn.microsoft.com/zh-cn/library/s5zscb2d(v=vs.80).aspx

被动回收

.NET Framework 4

  在大多数情况下,垃圾回收器可以确定执行回收的最佳时间,应让其独立运行。 在某些不常发生的情况下,强制回收可以提高应用程序的性能。 在这些情况下,可使用 Collect 方法强制垃圾回收,以引发垃圾回收。

  当应用程序代码中某个确定的点上使用的内存量大量减少时,请使用 Collect 方法。 例如,如果应用程序使用包含若干个控件的复杂对话框,则在对话框关闭时调用 Collect 可能会通过立即回收内存来提高性能。 务必确保应用程序不会过于频繁地引发垃圾回收,否则当垃圾回收器无效率地尝试回收对象时,可能会使性能降低。 Optimized 模式使垃圾回收器可以根据收集是否有效率来确定是否进行回收。

http://msdn.microsoft.com/zh-cn/library/bb384155(v=vs.100).aspx

时间: 2024-10-12 19:55:24

强制回收和IDisposable.Dispose方法的相关文章

IDisposable .Dispose 方法

如果某对象的 Dispose 方法被调用一次以上,则该对象必须忽略第一次调用后的所有调用. 如果对象的 Dispose 方法被多次调用,该对象一定不要引发异常. 除Dispose 之外的实例方法在资源已释放时会引发 ObjectDisposedException. 用户可能期望资源类型使用特定的约定来表示已分配状态和已释放状态.流类即是这样一种示例,传统上认为它们要么打开要么关闭.具有此种约定的类的实施者可能选择实现具有自定义名称(如“Close”)的公用方法来调用 Dispose 方法. 因为

实现 Dispose 方法

实现 Dispose 方法 MSDN 类型的 Dispose 方法应释放它拥有的所有资源.它还应该通过调用其父类型的 Dispose 方法释放其基类型拥有的所有资源.该父类型的 Dispose 方法应该释放它拥有的所有资源并同样也调用其父类型的 Dispose 方法,从而在整个基类型层次结构中传播此模式.若要确保始终正确地清理资源,Dispose 方法应该可以被多次调用而不引发任何异常. 要点 C++ 程序员不应该使用本主题.而应参见 Destructors and Finalizers in

是否需要手动执行DataContext的Dispose方法?

我们知道DataContext实现了IDisposable接口.在C#中,凡是实现了IDisposable接口的类,都推荐的使用using语句.如下: using (DataContext db = new DataContext(fileOrServerOrConnection)) { //... } 使用using语句可以确保以正确的方式调用Dispose方法,即使在语句块中出现异常,Dispose方法也将被执行. 但当我们使用如下代码时,将不可避免地得到“System.ObjectDisp

定义页面的Dispose方法:[before]unload事件启示录

前言 最近实施的同事报障,说用户审批流程后直接关闭浏览器,操作十余次后系统就报用户会话数超过上限,咨询4A同事后得知登陆后需要显式调用登出API才能清理4A端,否则必然会超出会话上限. 即使在页面上增添一个登出按钮也无法保证用户不会直接关掉浏览器,更何况用户已经习惯这样做,增加功能好弄,改变习惯却难啊.这时想起N年用过的window.onbeforeunload和window.onunload事件. 本文记录重拾这两个家伙的经过,以便日后用时少坑. 为网页写个Dispose方法 C#中我们会将释

编写高质量代码改善C#程序的157个建议——建议48:Dispose方法应允许被多次调用

建议48:Dispose方法应允许被多次调用 一个类型的Dispose方法应该允许被多次调用而不抛出异常.鉴于此,类型内部维护了一个私有的bool变量disposed,如下: private bool disposed = false; 在实际清理代码的方法中,加入一下判断: if(disposed) { return; } //省略清理部分的代码,并在方法最后为disposed赋值为true disposed = true; 这意味着,如果类型已经被清理过,那么清理工作将不再进行. 对象被调用

dispose方法的使用

java中的dispose()方法 从JAVA 1.5 的帮助文档的原文 - dispose - public void dispose() 释放由此 Window.其子组件及其拥有的所有子组件所使用的所有本机屏幕资源.即这些 Component 的资源将被破坏,它们使用的所有内存都将返回到操作系统,并将它们标记为不可显示. 通过随后对 pack 或 show 的调用重新构造本机资源,可以再次显示 Window 及其子组件.重新创建的 Window 及其子组件的状态在移除 Window 的点上与

不使用第三方组件,只调用COM,导出EXECL,但只装OFFICE2007,不装2003,直接强制引用动态库的方法

步骤1:强制引用动态库”Microsoft.Office.Interop.Excel“,版本为11.0: 步骤2:添加引用OFFICE2007的COM组件”MicroSoft Office 12.0 Object Library“(OFFICE2003的是MicroSoft Office 11.0 Object Library),添加完成后动态库为”microsoft.office.core“. 不使用第三方组件,只调用COM,导出EXECL,但只装OFFICE2007,不装2003,直接强制引

Chrome浏览器扩展程序强制停用的解决方法

http://blog.csdn.net/pipisorry/article/details/37728839 一.加载正在开发的扩展程序 这里以加载一个已有的Chrome扩展程序为例: 把已有的扩展程序(.crx文件)后缀改为.zip,就可以把它解压缩到某个目录,比如将lingoes_chrome_2.1.crx改成lingoes_chrome_2.1.zip并解压到D:\Downloads\Editor\lingoes_chrome_2.1.zip 打开谷歌浏览器 - 工具 - 扩展程序 -

Git误操作 git reset强制回滚 恢复commit方法

参考: 找回Git中丢失的Commit Git误操作 git reset强制回滚 恢复commit方法 使用Git时,常有误操作,在Commit之后又执行了git reset --hard HEAD强制回滚本地记录以及文件到服务器版本,导致本地做的修改全部恢复到Git当前分支的服务器版本,同时Commmit记录也消失了. 此时解决方法是通过git reflog来查看先前记录并恢复: git reflog会记录所有HEAD的历史,也就是说当你做 reset,checkout等操作的时候,这些操作会