C#/WPF 使用的Task线程程序缺依旧响应缓慢问题
问题: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线程程序缺依旧响应缓慢问题的更多相关文章
- 编写高质量代码改善程序的157个建议:第87个建议之区分WPF和WinForm的线程模型
今天有时间了,继续<编写高质量代码改善程序的157个建议>的阅读,当我阅读到建议87的时候,里面的一些代码示例和文中所说的不一致了,是不是我现在用的是NetFramework 4.0的缘故 ...
- 编写高质量代码改善C#程序的157个建议——建议87:区分WPF和WinForm的线程模型
建议87:区分WPF和WinForm的线程模型 WPF和WinForm窗体应用程序都有一个要求,那就是UI元素(如Button.TextBox等)必须由创建它的那个线程进行更新.WinForm在这方面 ...
- 搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 (1)
搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 原文地址(英文):http://www.networkcomms.net/creating ...
- C# 异步编程3 TPL Task 异步程序开发
.Net在Framework4.0中增加了任务并行库,对开发人员来说利用多核多线程CPU环境变得更加简单,TPL正符合我们本系列的技术需求.因TPL涉及内容较多,且本系列文章为异步程序开发,所以本文并 ...
- WPF性能调试系列 – 应用程序时间线
WPF性能调试系列文章: WPF页面渲染优化:Application Timeline WPF页面业务加载优化:Ants Performance Profiler WPF内存优化:Ants Memor ...
- APUE 线程 - 程序清单
APUE 线程 - 程序清单 程序清单11-1 打印线程ID #include "util.h" #include<pthread.h> pthread_t ntid; ...
- WPF 开发自动开机启动程序
原文:WPF 开发自动开机启动程序 本文告诉大家如何在 WPF 开发一个可以自动启动的程序 本文使用的自动开机启动方法是通过快捷方式放在启动文件夹的方式. 创建快捷方式 /// <summary ...
- Delphi XE6 使用定时器或者线程解决程序界面无响应问题
---恢复内容开始--- 介绍 在手机应用上,我们不应该使用速度慢的代码,当然我们在桌面程序上也应该避免这个,当手机应用长时间没有相应的时候,程序会提示“程序没响应,是否关闭”的提示,这个非常不好,所 ...
- WPF Dispatcher.BeginInvoke子线程更新UI
在开发WPF应用时出现:”调用线程无法访问此对象,因为另一个线程拥有该对象.“ 是因为UI线程是WPF应用的主线程,若尝试子线程更新UI线程应使用Dispatcher.BeginInvoke()或者I ...
随机推荐
- pytest封神之路第五步 参数化进阶
用过unittest的朋友,肯定知道可以借助DDT实现参数化.用过JMeter的朋友,肯定知道JMeter自带了4种参数化方式(见参考资料).pytest同样支持参数化,而且很简单很实用. 语法 在& ...
- Java Set 常用集合 HashSet、LinkedHashSet、TreeSet
Java 中的 Set 是非常常用的数据类型.Set 是无序的 Collection,Java Set 有三个常用的实现类,分别是:HashSet.LinkedHashSet.TreeSet 本文基于 ...
- c++11 新特性实战 (一):多线程操作
c++11多线程操作 线程 thread int main() { thread t1(Test1); t1.join(); thread t2(Test2); t2.join(); thread t ...
- vue移动端记录列表滚动如何快速找到是哪个元素产生的滚动
使用下面的代码粘贴到调试工具中运行一下,然后滚动页面,就可以看到是哪个元素产生的滚动了 function findscroller(element) { element.onscroll = func ...
- 优雅的在React组件中注册事件
前言 在React的开发中,我们经常需要在 window 上注册一些事件, 比如按下 Esc 关闭弹窗, 按上下键选中列表内容等等.比较常见的操作是在组件 mount 的时候去 window 上监听一 ...
- 创建Vue项目及封装axios
1. 始vue化项目 https://www.cnblogs.com/xiaonq/p/11027880.html vue init webpack deaxios # 使用脚手架创建项目 deaxi ...
- 给select赋值的一种方法
做毕设遇到的问题,在update数据的时候,要先把原来的数据传递给前台,赋值给input等标签,但是啊,select标签没有value属性啊,所以在这里研究了一下,总结一个给select赋值的方法吧 ...
- C++指针delete后还要置为null
非常好的一篇说明: 转载:https://blog.csdn.net/qq_36570733/article/details/80043321 众所周知,最开始我们用new来创建一个指针,那么等我们用 ...
- 浙大《数据结构》学习&练习(一)算法初步
1.数据结构是数据在计算机中的组织方式,类比图书在图书馆中的存储,应该如何分类,如何在书架上存取. 2.抽象数据结构是对一类的数据的一种组织方式的通用(抽象)描述,包括类型的名称,数据对象集和操作集. ...
- 达梦产品技术支持培训-day6-DM性能诊断与优化
(本文只作为个人随笔用途,非官方文档,请勿作他用,谢谢) 1.DM8查询优化基本思路 1.1 操作系统性能诊断 linux常用系统监控命令 使用 top 命令查看cpu使用率 使用 iostat 命令 ...