问题:C#/WPF 使用的Task线程程序缺依旧响应缓慢问题

摘要:相信很多做WPF的开发者在请求接口的时候会去采用开一个线程Task去请求接口。避免UI卡主等等。但有一个问题是但开的线程比较多的情况下程序会卡主一段小时间。

环境:WPF、Win7 四核。

了解Task的使用机制

先上一个环境图:

从图片可以看出机子是四核的Cpu。业务逻辑是从登录到主页的数据全部显示。根据产品的需求,业务的完全展示需要请求大概8个接口。一开始我采用的都是接口同步的情况去请求,然后由于同步导致UI卡顿的原因要求我优化程序。因此我就将方法改为异步请求并且在外层包裹一个Task。然后重点就来,这个Task是真的香,用起来还不错。O(∩_∩)O哈哈~ 然后问题就随之而来了。我的电脑由于是八核的,所以请求起来都还算挺流畅。但有一台测试机就是会卡顿,但平时用起来也好好的搞得我是焦头烂额。后来去一步步排查发现但我Task越用越多的时候,程序忽然就变得慢慢的卡起来。这时候才明确的找到问题的所在。就是Task用得太多了。通俗易懂来讲呢,Task并不是万能的,它其实可以说是在透支这电脑或者程序的性能,来提高效率。因此对于Task的运用一定得合理。否则Task这么香为何不多用几个Task。

如何实际去运用它

首先得对业务逻辑进行拆分,分为重要模块和次要模块。对于重要模块优先去进行处理和显示再来对这些次要模块进行处理。比如主页的一些展示用的数据列比较重要可以对他进行优先操作。对于一些头像啊、名称啊、等级啊。等等次要模块可以稍微的给他延后显示,因为用户一进来可能关注的是你首页重要的数据是否展示完整了。因此合理的去运用Task能有效的提高系统的性能。过多的使用可能会导致性能的下降。

最后

希望对大家有所帮助,还有什么问题可以在下方留言。谢谢!

C#/WPF 使用的Task线程程序缺依旧响应缓慢问题的更多相关文章

  1. 编写高质量代码改善程序的157个建议:第87个建议之区分WPF和WinForm的线程模型

    今天有时间了,继续<编写高质量代码改善程序的157个建议>的阅读,当我阅读到建议87的时候,里面的一些代码示例和文中所说的不一致了,是不是我现在用的是NetFramework 4.0的缘故 ...

  2. 编写高质量代码改善C#程序的157个建议——建议87:区分WPF和WinForm的线程模型

    建议87:区分WPF和WinForm的线程模型 WPF和WinForm窗体应用程序都有一个要求,那就是UI元素(如Button.TextBox等)必须由创建它的那个线程进行更新.WinForm在这方面 ...

  3. 搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 (1)

    搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 原文地址(英文):http://www.networkcomms.net/creating ...

  4. C# 异步编程3 TPL Task 异步程序开发

    .Net在Framework4.0中增加了任务并行库,对开发人员来说利用多核多线程CPU环境变得更加简单,TPL正符合我们本系列的技术需求.因TPL涉及内容较多,且本系列文章为异步程序开发,所以本文并 ...

  5. WPF性能调试系列 – 应用程序时间线

    WPF性能调试系列文章: WPF页面渲染优化:Application Timeline WPF页面业务加载优化:Ants Performance Profiler WPF内存优化:Ants Memor ...

  6. APUE 线程 - 程序清单

    APUE 线程 - 程序清单 程序清单11-1 打印线程ID #include "util.h" #include<pthread.h> pthread_t ntid; ...

  7. WPF 开发自动开机启动程序

    原文:WPF 开发自动开机启动程序 本文告诉大家如何在 WPF 开发一个可以自动启动的程序 本文使用的自动开机启动方法是通过快捷方式放在启动文件夹的方式. 创建快捷方式 /// <summary ...

  8. Delphi XE6 使用定时器或者线程解决程序界面无响应问题

    ---恢复内容开始--- 介绍 在手机应用上,我们不应该使用速度慢的代码,当然我们在桌面程序上也应该避免这个,当手机应用长时间没有相应的时候,程序会提示“程序没响应,是否关闭”的提示,这个非常不好,所 ...

  9. WPF Dispatcher.BeginInvoke子线程更新UI

    在开发WPF应用时出现:”调用线程无法访问此对象,因为另一个线程拥有该对象.“ 是因为UI线程是WPF应用的主线程,若尝试子线程更新UI线程应使用Dispatcher.BeginInvoke()或者I ...

随机推荐

  1. vue中父子组件传值问题 通过props 和 $emit()方法

    (代码在最后) 1.父组件给子组件传值直接通过props,听着很简单,但是对于初学者来说还是比较难以理解的,今天小白通过自己的实践操作结合代码分析一下 案例  把模态框单独的抽离出来,当作一个组件 第 ...

  2. 关于properties文件的一些问题

    在写properties文件时,比如jdbc.properties文件配置连接数据库的账号密码时,不要留有空格,不然会报错 com.mchange.v2.resourcepool.CannotAcqu ...

  3. 常见消息中间件之ActiveMQ

    前言 消息队列是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成.目前消息队列已经逐渐成为企业IT系统内部通信的核心手段,它具有低耦合.可靠投递.广播.流量控 ...

  4. 你还不会ES的CUD吗?

    近端时间在搬砖过程中对es进行了操作,但是对es查询文档不熟悉,所以这两周都在研究es,简略看了<Elasticsearch权威指南>,摸摸鱼又是一天. es是一款基于Lucene的实时分 ...

  5. jsp(java server pages):java服务器端的页面

    jsp(java server pages):java服务器端的页面 JSP的执行过程1.浏览器输入一个jsp页面2.tomcat会接受*.jsp请求,将该请求发送到org.apache.jasper ...

  6. 深入研究Broker是如何持久化的

    前言 上篇文章王子和大家讨论了一下RocketMQ生产者发送消息的底层原理,今天我们接着这个话题,继续深入聊一聊RocketMQ的Broker是如何持久化的. Broker的持久化对于整个Rocket ...

  7. 普利姆算法(prim)

    普利姆算法(prim)求最小生成树(MST)过程详解 (原网址) 1 2 3 4 5 6 7 分步阅读 生活中最小生成树的应用十分广泛,比如:要连通n个城市需要n-1条边线路,那么怎么样建设才能使工程 ...

  8. c++中的GetModuleFileName函数的用法以及作用

    参考: 1. http://blog.sina.com.cn/s/blog_b078a1cb0101fw48.html 2. https://www.cnblogs.com/Satu/p/820393 ...

  9. 如何选择JVM垃圾回收器?

    明确垃圾回收器组合 -XX:+UseSerialGC 年轻代和老年代都用串行收集器 -XX:+UseParNewGC 年轻代使用ParNew,老年代使用 Serial Old -XX:+UsePara ...

  10. 【小白学PyTorch】21 Keras的API详解(上)卷积、激活、初始化、正则

    [新闻]:机器学习炼丹术的粉丝的人工智能交流群已经建立,目前有目标检测.医学图像.时间序列等多个目标为技术学习的分群和水群唠嗑答疑解惑的总群,欢迎大家加炼丹兄为好友,加入炼丹协会.微信:cyx6450 ...