日期:2014-05-18  浏览次数:21176 次

WPF内存、资源释放问题
在搜wpf相关资料时看到说wpf程序很耗内存,现在想优化下自己的程序。

搜了下内存、资源释放的资料,什么GC啊、Dispose啊、托管资源啊、非托管资源啊都是这些,但看不懂。

我想问下怎样可以简单优化自己的程序呢??

例如定义了一个string s = "abc";是不是用完后,s = null;这样就会释放s的资源?

window.Close()后,是不是该窗体的资源就释放了?不是的话要怎么释放??

------解决方案--------------------
我可以告诉你两三天经验,但是我恐怕你一时半刻也只是当作随便一说。

通常需要打印程序进入各种方法的日志,然后看看假设在一整“疯狂”操作之后,操作几乎静止下来后,程序会不会还在无休止地运行着什么,甚至产生了循环。好的情况是从日志可以看到程序处理几乎停下来了。

通常要在自动化测试中写一条语句去判断某些处理(异步回调、事件处理)是否意外地“重新进入”了。这往往说明某些事件注册到更大的、生命周期很长的对象上,从而当程序已经移除了某些组件之后,这些组件其实无法真正被GC回收。这就是所谓的“实践溢出”问题。实际上既然使用 += 来注册事件,那么就应该使用 -= 来注销事件处理。不注销,就会使得成千上万(甚至几十万上百万)的组件无法真正销毁。
------解决方案--------------------
两三天 --> 两三条


如果你只是做一般入门书上作为范例的那种编程也就算了。

如果是成熟的产品,那么使用wpf/silverlight这种平台编程其实比winform要复杂多了。因为只有大量异步并发多线程编程才能让程序变得流程,然后这就为调试带来的巨大挑战。没有测试驱动的习惯,没有自己做一套自动化测试系统,靠书上那点理论,你很快就会在调试巨多多线程程序代码面前失去耐心的。