近期,使用c#+wpf开发的软件准备正式投入使用了,使用前进行了大量的测试,测试后发现了一些问题,其中最让人头疼的就是软件的性能问题(稳定性)。
这里的稳定性具体表现在机器的cpu占有率和内存使用情况:
1,CPU占用率节节攀升。
2,可用内存越来越少,最后爆OutOfMemoryException。
这两点足以影响软件的应用,一日不除,终日不得安宁!
发现问题后,多方搜寻资料,最终问题解决,这里做一些记录,一来分享给各路开发者,二来记录以备自己查看。
导致cpu占用率高:
1.是否有textbox的不断循环中取值,赋值以及ScrollToend,解决方法:将TextBox控件换成ListBox,这样是一行一行插入
2.搜索代码中是否有while死循环。解决方法:优化代码,删掉死循环,while循环中可以加入
system.application.doevent();
thread.sleep(100);
我本人的项目中就是因为存在大量对textBox的操作,而导致的,我将TextBox控件换成ListBox后CPU占用率明显下降。
导致可用内存越来越少的原因:
1.界面上很多动画切换效果,如:gif动画的帧切换,解决方法gif动画暂用大量内存,需要及时释放,尽量少用gif
2.界面上显示很多图片,图片资源未回收,解决方法:释放图片资源
一:将Image类转换成Bitmap类
System.Drawing.Image img = System.Drawing.Image.FromFile(filepath);
System.Drawing.Image bmp = new System.Drawing.Bitmap(img);
img.Dispose();
然后使用 bmp作为PictureBox的图片源
二:从流中读取
FileStream fileStream = new FileStream("文件名", FileMode.Open, FileAccess.Read);
pictureBox1.Image = Image.FromStream(fileStream);
fileStream.Close();
fileStream.Dispose();
3.非托管资源及其内存回收,对可能多次调用的类,应该严格按照“清理模式”格式书写,保证类资源被及时释放:
标准的清理模式(~dispose)写法:
MyClass:IDisposable { private bool disposed = false; ~MyClass() { Dispose(false); } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } private void Dispose(bool disposing) { if(disposed == false) { if(disposing == true) { // 释托管代码 ...... } // 释非代码 ...... } disposed = true; } }