C#若出现内存泄漏时可通过如下方式进行查找。
多次运行后在VS的诊断工具中截取内存快照,
然后点开内存快照,查看托管内存信息,如下图:
上图中PerspectiveViewModel是PerspectiveView页面的VM,理论上只有打开它时才会创建1个,离开这个页面时它会被GC回收。
但通过多次进入PerspectiveView来看,它的VM并没有被正常回收,导致其VM数量不断增加。如此在所有存在的PerspectiveViewModel中都可能会响应某一个事件,而此事件若是使用的某一个当前的其它类型实例,就有可能造成未知错误。
如PerspectiveView的实例现在存在3个,分别是PerspectiveView1、PerspectiveView2、PerspectiveView3,它们都持有一个原来宽度分别为w1=11,w2=12,w3=13,而传入到内部方法的变量为a1数组,它的宽度为大于w3,那么就会造成“index out of range”的错误。
回到上图,从图上为展开圈中的的路径显示情况,从上可以清楚的看到问题是由ProcessIndexStack造成的此问题。然后回到class中找到ProcessIndexStack方法或变量产生问题的原因(图中为方法),解决之即可。
图上的问题是由于某人在ProcessIndexStack方法中使用了SemaphoreSlim,但在使用完成后并没有将它及时Release,导致它所在的PerspectiveViewModel不能被GC回收,于是就会不断实例化PerspectiveViewModel。