日期:2014-05-17  浏览次数:20918 次

悬赏100分,为什么我编的C#应用程序越运行越慢
速度越来越慢,内存占用越来越高。关了重开,就又快了。
已知:
1.GC.Collection 毫无用处
2.数据库连接运行一次就关闭一次,所以应该不是数据库连接造成的。
3.我的程序里有用到 ref 类型的结构体数组,长度30000
4.我比较笨,Dispose()不会用,依样画葫芦写了   
       public void Dispose()
        { 
            GC.SuppressFinalize(this);
        }
没有效果。

求分析,另外求Dispose的正确用法,最好和那个万精油例子不一样

------解决方案--------------------
想办法把你的程序改造成只new一个NearestCalBatchPoint,每次调用都用这个实例,程序结束时再释放,不要每次都去new
------解决方案--------------------
3.ref 类型的结构体数组? 指向一个结构体的指针,然后是30000字节,结构体是值类型,在栈上分配内存空间,我觉得问题出在这个结构体数组上,轻量级的对象用结构,数据量大或者有复杂处理逻辑的对象最好用类。
4.隐式Dispose()调用Dispose(true)然后调用GC.SuppressFinalize(this),前面带参数ture的dispose函数已经释放了托管和非托管的内存,后面这个GC.SuppressFinalize(this),是为了防止垃圾回收器对不需要终止的对象调用Object.Finalize.因为你已经显示的调用了Dispose(true)了。

我给你复制一段MSDN的话,我觉得对你可以能有帮助。
 当类型使用文件句柄或数据库连接这类在回收使用托管对象时必须释放的非托管资源时,该类型必须实现 Finalize。有关辅助和具有更多控制的资源处置方式,请参见 IDisposable 接口。 Finalize 可以采取任何操作,包括在垃圾回收过程中清理了对象后使对象复活(即,使对象再次可访问)。但是,对象只能复活一次;在垃圾回收过程中,不能对复活对象调用 Finalize。