近期,使用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;
}
}

4.确保万无一失,使用using(){}来引用类,使用方法:

    using(classA a =new classA()){
      //用完后就释放
    }
    只有继承:IDisposable的类才能用using

5.网上给出了一个强制回收内存的方法,貌似看起来内存占用是减少了,一调用内存就降下来。先别高兴太早,这其实是伪释放,只为暂时解决内存大量泄露导致系统崩溃而急需解决的情况。
具体原因:http://blog.sina.com.cn/s/blog_49f8960e0100081x.html,关键字:将物理内存转到虚拟内存,涉及磁盘读写。

ps:为了好看一点,我们可以加进去!

  具体代码:

[DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize")]
public static extern int SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize);
/// <summary>
/// 释放内存
/// </summary>
public static void ClearMemory()
{
GC.Collect();
GC.WaitForPendingFinalizers();
if (Environment.OSVersion.Platform == PlatformID.Win32NT)
{
SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -, -);
}
}

6.最后的杀手锏,查看软件中是否调用过什么开源插件,升级插件到稳定版本。

  本人项目中就遇到这个问题,本人项目中使用了cefsharp插件,期初使用的是低版本,这次索性升级到最新版本,然后将.net框架也升级了(其中也遇到了一些问题,NuGet资源下载慢,.net升级后与原来的部分库文件不匹配等,打怪升级各个击破吧!),然后就奇迹的解决了问题,所以最后结论就是需要不断的尝试和改进,寻找一切可能的突破口来解决问题。

-------------------------------分隔线-----------------------

写在最后:对于c#程序的性能优化工作,我们可以多实用工具,工欲善其事必先利其器,如:

1.vs自带的性能分析工具:

分析->诊断,按照指导操作。

2.ANTS Performance Profiler和ANTS Memory Profiler,分别用来做性能分析和内存占用分析,讲具体操作方法自行百度,能够准确找到性能瓶颈所在。

3.DotTrace,和上面的工具类似。

4.可以安装.net reflection来查看dll具体方法(可能会导致vs无法调试)

c#+wpf项目性能优化之OutOfMemoryException解密的更多相关文章

  1. C# 大型电商项目性能优化(一)

    经过几个月的忙碌,我厂最近的电商平台项目终于上线,期间遇到的问题以及解决方案,也可以拿来和大家多做交流了. 我厂的项目大多采用C#.net,使用逐渐发展并流行起来的EF(Entity Framewor ...

  2. vuejs项目性能优化总结

    在使用elementUI构建公司管理系统时,发现首屏加载时间长,加载的网络资源比较多,对系统的体验性会差一点,而且用webpack打包的vuejs的vendor包会比较大.所以通过搜集网上所有对于vu ...

  3. Vue项目性能优化整理

    以下方式基于 @vue/cli 快速搭建的交互式项目脚手架 1. 路由懒加载 当打包构建应用时,JavaScript 包会变得非常大,影响页面加载.如果我们能把不同路由对应的组件分割成不同的代码块,然 ...

  4. 【Vuejs】335-(超全) Vue 项目性能优化实践指南

    点击上方"前端自习课"关注,学习起来~ 前言 Vue 框架通过数据双向绑定和虚拟 DOM 技术,帮我们处理了前端开发中最脏最累的 DOM 操作部分, 我们不再需要去考虑如何操作 D ...

  5. vue项目性能优化总结

    在使用elementUI构建公司管理系统时,发现首屏加载时间长,加载的网络资源比较多,对系统的体验性会差一点,而且用webpack打包的vuejs的vendor包会比较大.所以通过搜集网上所有对于vu ...

  6. Nuxt 项目性能优化调研

    性能优化,这是面试中经常会聊到的话题.我觉得性能优化应该因具体场景而异,因不同项目而异,不同的手段不同的方案并不一定适合所有项目,当然这其中不乏一些普适的方案,比如耳熟能详的文件压缩,文件缓存,CDN ...

  7. Reactjs项目性能优化

    在construct中绑定函数this shouldComponentUpdate React.PureComponent 无状态组件 chrome浏览器性能优化工具 setTimeout,setIn ...

  8. React项目性能优化

    1. 使用生产版本和Fragment 1. 生产版本 确保发布的代码是生产模式下(压缩)打包的代码. 一般运行npm run build命令. 直接从webpack看配置文件,需要设置mode = ' ...

  9. EF+MVC+cod First项目性能优化总结

    1.EF:this.Configuration.UseDatabaseNullSemantics = true; //关闭数据库null比较行为 2.实体必填字段要加:[Required]属性,可定长 ...

随机推荐

  1. 迭代器Iteration

    定义: 可以被next()调用并不断返回下一个值的对象成为迭代器Iterator 与可迭代(Iterable)的区别: Iterable定义为:凡是作用于for循环的对象.比如list(),dict{ ...

  2. El表达式的判断字符串的长度和截取,日期时间的格式化

    <c:if test="${fn:length(each.wii_name) >= 20}"> ${fn:substring(each.wii_name, 0,2 ...

  3. react-redux状态管理思想

    最近一段一直在加班做项目,几乎每天都要加班到晚上9点,每周也只休息一天,一直没有时间把eact全家桶,再整体熟悉一遍.索性,就在最近的项目中,借鉴了react-redux的思想,维护状态和发布acti ...

  4. jquery pjax 用法总结

    以前我们点击a链接的时候总是会刷新整个页面并跳转到新页面,中间可以很明显的看到短暂的白屏.pjax就很好的解决了这问题. pjax的原理很简单,就是发送一个ajax请求,获取html代码,再把相关代码 ...

  5. AOP面向切面编程在Android中的使用

    GitHub地址(欢迎下载完整Demo) https://github.com/ganchuanpu/AOPDemo 项目需求描述 我想类似于这样的个人中心的界面,大家都不会陌生吧.那几个有箭头的地方 ...

  6. springboot 整合 MongoDB 实现登录注册,html 页面获取后台参数的方法

    springboot简介: Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不 ...

  7. WebCracker4.0和monster字典——路由器登陆密码破解工具

    路由器登陆密码破解,很伤cpu的

  8. MySQL的bigint类型

    bigint支持的数字的大小范围为:19位,存电话号码.有符号范围:-9223372036854775808 到 9223372036854775807 int支持的数字范围为:10位,有符号范围:- ...

  9. zabbix的各种键值

    zabbix服务器端通过与zabbix agent通信来获取客户端服务器的数据,agent分为两个版本,在配置主机我们可以看到一个是agent,另一个是agent(active). agent:zab ...

  10. java并发编程基础 --- 4.1线程简介

    一.线程简介 什么是线程: 现在操作系统在运行一个程序时,会为其创建一个进程.例如,启动一个java程序,操作系统就会创建一个java进程.现代操作系统调度的最小单元是线程,也叫轻量级进程,在一个进程 ...