现在的位置: 首页 > 综合 > 正文

项目辅助开发器 1.1 Beta2(源码)增加对窗体资源优化(浅谈)

2012年08月17日 ⁄ 综合 ⁄ 共 1597字 ⁄ 字号 评论关闭

  源代码
     

     
此版本最重要的功能是对窗体资源优化,其次是代码模板编辑。
      当每次进行大量的实体生成,或者打开多个选项卡,这个时候内存的使用量会非常高。当你把选项卡关闭时内存还是没有被及时释放干净。当初还以为是自己用的控件有问题,后来自己新建立了一个工程做了下试验,得到的结果很惊人,不知道为什么。下面说下我的试验过程。
1.新建立一个Windows应用程序
2.做两个界面,第一个界面只有一个打开界面按钮。第二个界面有一个listview(我这里用这个测试,用其他的也一样).
3.在第2个窗体循环10W次,每次都给listview添加一个guid(目的是让字符串无重复).
4.在窗体一打开窗体按钮显示窗体2.
下面开始分析我没有做优化前的数据
打开程序什么都没点击时的内存占用 506M

弹出5个窗口后内存使用量608MB,多了102MB

关闭5个窗口时567MB,比打开5个窗口时多少了41M,有61M内存残留,没释放干净

下面是我加了优化代码后的数据
打开时什么都没打开数据502MB

打开5个窗口606,多了104

全部关闭后526,释放掉了80MB。24M没释放掉。

这些数据可能不准确,但我相信优化后绝对有效果了。

说下优化思路吧,高手、愤青、没素质的提前走开。看了可能会笑,因为我也不知道具体原理,只能简单的谈一下。
C#是的内存不需要手动整理,会自动释放。可经过测试只是把整个程序全部关闭时才会释放干净,单一只关闭一个窗体可能无法及时释放或其他原因。这个时候就需要手动释放,例如我这种多选项卡,可能会生成大量代码的工具。我需要及时处理内存。经过多次测试猜测可能为如下原因导致内存无法释放完整。关闭窗体时可能只是把窗体资源释放,但窗体上的控件还是有引用存在的,所以垃圾回收没有及时处理掉。
所以需要手动调用System.GC.Collect()强制回收资源,这个方法可能是把内存中无引用的空间回收掉。所以调用该方法之前要把对象置为null。才可以正确强制回收处理资源。
我的处理方式是在每个窗体关闭时触发Close把当前窗体置为null,然后调用Collect方法强制回收,可经过测试直接写在窗体里无法把窗体本身设置为null。所以我做了个自定义事件,当关闭时触发我自定义的事件进行回收。
以上都是测试得出的效果做结论和推断,不一定准确,有待考察。写出来的目的是想告诫一下大家,让CLR自动处理内存也不一定好。

我把做的例子发给大家,可以自己测试,如果得到什么好的结论请留言发出来,我也想了解一下为什么。
有问题请加QQ群:63864931
资源释放源码

1.1 Beta2版本功能(最新版)

1.增加了生成模板编辑功能
2.增加CSDN网摘采集插件(插件可能会报错-程序-插件管理-选中插件,设置类库文件为你机器上的路径,所有插件在程序的Plug目录下)
3.对程序内存使用量进行了简单优化

1.1 Beta1版本功能

1.增加了批量生成实体类功能
2.增加NHibernate实体文件生成
3.增加NHibernate实体配置文件生成
4.增加Template文件目录,存放模板文件,目前该目录只含有实体模板和Nhibernate配置文件模板.可以自己打开进行编辑.

更多图片请参见:http://www.cnblogs.com/dirain/archive/2008/06/14/1222023.html

1.0 Beta2版本

1.增加文章采集插件
2.采用多线程优化窗体性能
3.修正了带参数SQL语句的类型问题

1.0 Beta1版本

1.主界面仿VS编译器效果,界面用起来更熟悉。
2.可模拟查询分析器执行TSQL语句
3.支持SQL Server 2000、SQL Server 2005
4.以树形菜单方式显示数据库中可操作数据
4.可快速浏览表数据
5.动态生成带参数的SQL语句
6.实体类的生成
7.全自动程序升级,保证第一时间体验最新版本

抱歉!评论已关闭.