互联网解决方案咨询

梦想有多大路就会有多远:作一颗IT量子
  首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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

Posted on 2008-04-18 12:18  互联网粒子  阅读(1019)  评论(2编辑  收藏  举报
在写.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