日期:2014-05-16  浏览次数:20445 次

关于Dataset内存使用的疑惑
每次修改数据内容后调用查询,这时将产生一个dataset对象并占用内存,是不是应该在显示到页面后将这个myds指向的dataset对象释放呢?应该用什么语句来释放内存中的这个对象呢?myds.clear()或myds.Reset()可以吗?似乎.NET有专门的回收内存的机制?

环境:VS2010 C#

我的调用方式:

DataSet myds;
myds = Query("SELECT * FROM Test");  
//
//将myds显示到页面…………
//


查询函数:
        /// <summary>
        /// 执行查询语句,返回DataSet
        /// </summary>
        /// <param >查询语句</param>
        /// <returns>DataSet</returns>
        public static DataSet Query(string SQLString)
        {
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                DataSet ds = new DataSet();
                try
                {
                    ds.Clear();
                    connection.Open();
                    SqlDataAdapter command = new SqlDataAdapter(SQLString, connection);
                    command.Fill(ds, "ds");
                }
                catch (System.Data.SqlClient.SqlException ex)
                {
                    throw new Exception(ex.Message);
                }
                return ds;
            }
        }

------解决方案--------------------
在.net时代, 微软为开发人员提供了一个强有力的机制--垃圾回收. 垃圾回收机制是CLR的一部分, 我们不用操心内存何时释放, 我们可以花更多精力关注应用程序的业务逻辑. CLR里面的垃圾回收机制用一定的算法判断某些内存程序不再使用,回收这些内存并交给我们的程序再使用.

"垃圾回收器"也许并不像许多人想象的一样会立即执行(当堆中的资源需要释放时),而是在引用类型的引用被删除和它在"堆"中的对象实例被删除中间有 个间隔,为什么呢? 因为"垃圾回收器"的调用是比较消耗系统资源的,因此不可能经常被调用!

基于这种机制,可实现IDisposable接口的Dispose()来显示释放由对象使用的所有未托管资源。

即可 DataSet.Dispose() 来释放资源。