问题描述
我写了一个类继承Image类,这个Image需要在界面render的时候变化图片,其中变化的50张图片在类初始化的时候被初始化到数组privatereadonlyList<BitmapImage>_listOfImageSource=newList<BitmapImage()当界面render的时候我写了图片交替更新的代码如下publicvoidCompositionTarget_Rendering(objectsender,EventArgse){GC.Collect();GC.WaitForPendingFinalizers();if((_listOfImageSource.Count>0)&&_currentIamgeIndex<_listOfImageSource.Count){this.Source=null;this.Source=_listOfImageSource[_currentIamgeIndex];出现问题的地方}_currentIamgeIndex+=_stepInterval;if(_currentIamgeIndex>_listOfImageSource.Count)//stoptheanimmation{this.Visibility=Visibility.Hidden;_parentWindow.Visibility=Visibility.Hidden;this.Source=null;CompositionTarget.Rendering-=CompositionTarget_Rendering;}}经过测试发现上述代码里this.Source=_listOfImageSource[_currentIamgeIndex];是出现问题的地方,如果我让图片一直保持第一帧,似乎内存就不会暴增,但一旦改成变化的,内存就噌噌的网上增,即使动画结束也依然保持,请教各位大侠,如何要解决啊?尝试了好多办法,没用啊,无语了
解决方案
解决方案二:
能在描述细一些吗?涨的有多快,每次改变一次图片,都涨好几M吗?另外,楼主这50个图片,每个多大?
解决方案三:
引用1楼SPFarm的回复:
能在描述细一些吗?涨的有多快,每次改变一次图片,都涨好几M吗?另外,楼主这50个图片,每个多大?
从动画开始到动画结束内存从110M能涨到390M。因为图片是透明的png图片,有些图片就几K,但有些图片差不多要50K。没改一次都涨好几兆。
解决方案四:
是不是还没有到释放memory的时机呢。看看下面的讨论stillmemory-leaksin.net4-bindingmemoryBitmapImagetoImage-Source(这里面说550M时会开始释放)WPFBitmapImageMemory
解决方案五:
刚才还看了下msdn,BitmapImage没有实现IDisposable接口。
解决方案六:
不要看到内存涨了,就说内存泄露关键是什么时候涨的,涨了还会不会降回去你连续定义double[]d=newdouble[20000000];内存一样会暴涨的
解决方案七:
引用1楼SPFarm的回复:
能在描述细一些吗?涨的有多快,每次改变一次图片,都涨好几M吗?另外,楼主这50个图片,每个多大?
从动画开始到动画结束内存从110M能涨到390M。因为图片是透明的png图片,有些图片就几K,但有些图片差不多要50K。没改一次都涨好几兆。引用5楼Z65443344的回复:
不要看到内存涨了,就说内存泄露关键是什么时候涨的,涨了还会不会降回去你连续定义double[]d=newdouble[20000000];内存一样会暴涨的
不会回来啊,除非重启客户端。经过测试发现上述代码里this.Source=_listOfImageSource[_currentIamgeIndex];是出现问题的地方,如果我让图片一直保持第一帧,似乎内存就不会暴增,但一旦改成变化的,内存就噌噌的网上增,即使动画结束也依然保持,
解决方案八:
我用的是.net4.0,VS2010,我写了类似于楼主的代码,并没有出现内存暴涨的情况。不如楼主把代码择出来,弄成一个可以重现的小程序,发上来。大家也好拿回去试试。