• 关于及时回收(GC)系统资源的析构对象的的示例


    在写.net程序时通常会遇到如何正确来释放资源,执行析构函数来提高用户程序的性能,虽然。NET有GC功能,但能做好即时手工来释放资源是很值的做的一件事情,不用等到GC的策略来调用回收机制,有可能会销毁非托管资源,如SqlConnection,那对我们又要重新来生成非托管资源了。
    以下代码在VS2005通过
    下面的代码是一个支持Dispose的类,把它放在app_code里,注意要引用System.web组件
    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;

    /// <summary>
    /// Summary description for DisposeClass
    /// </summary>
    public class DisposeClass : IDisposable
    {
        public DisposeClass()
        {
        }
        /**/
        /// <summary>
        /// 该对象是否已被销毁过
        /// </summary>
        private bool disposed;

        /**/
        /// <summary>
        /// Finalize函数
        /// </summary>
        ~DisposeClass()
        {
            //这个析构方法是当用户退出App时,他会自动清除
            System.Web.HttpContext.Current.Response.Write("对象被销毁<br>");
           
            //清理托管资源
            Dispose(false);
        }
        //清理托管资源和非托管资源的代码位置不要写反了
        //否则当一个托管对象已经被GC回收后,
        //再去调用它的Dispose 方法, 系统会触发一个 ObjectDisposedException 异常
        public void Dispose()
        {
            /*清理非托管资源     
             * */
            System.Web.HttpContext.Current.Response.Write("手动销毁对象<br>");
            Dispose(true);
            //通知GC, 偶已经被销毁过了,可以不用在管偶了。。。
            GC.SuppressFinalize(this);
        }

        /// <summary>
        /// Releases unmanaged and - optionally - managed resources
        /// </summary>
        /// <param name="disposing"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
        protected void Dispose(bool disposing)
        {
            if (!disposed)
            {
                if (disposing)
                {
                    //该函数为手动调用,此处可进行托管资源的清理              
                }
                //进行非托管资源的清理     
            }
            disposed = true;
        }
    }

    调用:
    随便建一个page
    放一个button来执行调用
    protected void Button1_Click(object sender, EventArgs e)
        {
            //手工释放1
            DisposeClass testClass1 = new DisposeClass();
            testClass1.Dispose();
            //手工释放2
            using( DisposeClass testClass2 = new DisposeClass())
            {
                Response.Write("过了这个using的生命周期自动会调用Dispose<br>");
            }
        }
    如何让程序执行析构方法~DisposeClass(),在windows测试是在你离开当前窗体或关闭App时,会去调用这个析构方法,但在web上不知道如何测,有知道的可以告诉我,谢谢。
    因为懂得所以慈爱Leung
  • 相关阅读:
    Spring之bean二生命周期
    Hibernate注解:一对多外键关联
    List<Object>和List<String>
    Eclipse设置模板代码
    Hibernate注解:一对一主键关联
    解决tomcat默认45s启动超时的问题
    ContextLoaderListener与DispatcherServlet所加载的applicationContext的区别
    Spring配置项<context:annotation-config/>说明
    Hibernate 实体关联关系映射【转】
    freemarker中使用shiro标签
  • 原文地址:https://www.cnblogs.com/Leung/p/1159665.html
Copyright © 2020-2023  润新知