.NET多线程知识快速学习
多线程是一个不会过时的话题,因为每个开发的成长必然要掌握这个知识点,否则半懂不懂怎么保证系统的可靠性和性能,其实在网上随便一搜都会有海量的文章说这个话题,大多数写得很细写得非常好,但发现很少有概览性的文章,我希望能借本文给大家一个全局视野,结合多年实践帮大家快速学习或者回顾思考,对感兴趣的知识点再深入学习了解。
一、知识点概括

二、具体实例演示如何实现
> Thread 多线程最基础的类
//ThreadPool.GetMaxThreads(out int maxTCount, out int maxPCount);
//ThreadPool.GetMinThreads(out int minTCount, out int minPCount);
//ThreadPool.SetMaxThreads(maxTCount, maxPCount);// 调整最大线程数
//ThreadPool.SetMinThreads(minTCount, minPCount);// 调整最小线程数 long tick = C_ITEM_COUNT;
ManualResetEvent signal = new ManualResetEvent(false);
Console.WriteLine("========== 示例:采用Thread执行处理 ==========");
for (int i = ; i < C_ITEM_COUNT; i++)
{
new Thread((obj) =>
{
Thread.Sleep();
Console.Write(" {0} ", obj);
if (Interlocked.Decrement(ref tick) == )
signal.Set();
}).Start(i);
}
Console.Write(" 等待子线程执行 ");
signal.WaitOne();
Console.WriteLine();
Console.WriteLine("全部线程执行完毕,按任意键继续...");
> ThreadPool 线程池,XX池的概念可以广泛应用于其他资源管理,例如字体池(防句柄泄露)、短信猫池等等
tick = C_ITEM_COUNT;
signal.Reset();
Console.WriteLine();
Console.WriteLine("========== 示例:采用ThreadPool执行处理 ==========");
for (int i = ; i < C_ITEM_COUNT; i++)
{
ThreadPool.QueueUserWorkItem((obj) =>
{
Thread.Sleep();
Console.Write(" {0} ", obj);
if (Interlocked.Decrement(ref tick) == )
signal.Set();
}, i);
}
Console.Write(" 等待子线程执行 ");
signal.WaitOne();
Console.WriteLine();
Console.WriteLine("全部线程执行完毕,按任意键继续...");
> Task 任务,功能丰富用法灵活。结合现实生活用字面意思去理解就好:可以同时做多个任务,任务做完可以接着做其他任务,任务可能会取消等等。
tick = C_ITEM_COUNT;
signal.Reset();
Console.WriteLine();
Console.WriteLine("========== 示例:采用Task执行处理,注意取消了处理{0}的进程 ==========", C_ITEM_COUNT - );
var tasks = new Tuple<Task, CancellationTokenSource>[C_ITEM_COUNT];
for (int i = ; i < C_ITEM_COUNT; i++)
{
var cts = new CancellationTokenSource();
var task = Task.Factory.StartNew((obj) =>
{
Thread.Sleep();
Console.Write(" {0} ", obj);
}, i, cts.Token);
task.ContinueWith((t) =>
{
if (Interlocked.Decrement(ref tick) == )
signal.Set();
});
tasks[i] = new Tuple<Task, CancellationTokenSource>(task, cts);
} tasks[C_ITEM_COUNT - ].Item2.Cancel();// 取消线程。 Console.Write(" 等待子线程执行 ");
signal.WaitOne();
Console.WriteLine();
Console.WriteLine("全部线程执行完毕,按任意键继续...");
> Parallel 并行
tick = C_ITEM_COUNT;
signal.Reset();
Console.WriteLine();
Console.WriteLine("========== 示例:采用Parallel执行处理 ==========");
Parallel.For(, C_ITEM_COUNT, obj =>
{
Thread.Sleep();
Console.Write(" {0} ", obj);
if (Interlocked.Decrement(ref tick) == )
signal.Set();
}); Console.Write(" 等待子线程执行 ");
signal.WaitOne();
Console.WriteLine();
Console.WriteLine("全部线程执行完毕,按任意键继续...");
以上示例执行结果如下,重点可以关注下"等待子线程执行"这个节点,理解主线程和各子线程的优先执行顺序

三、性能对比(理解线程池技术的性能也可以通过最大最小线程数调节)
> 循环数:200,线程池参数:默认

> 循环数:200,线程池参数:50 - 1000

> 循环数200,线程池参数:100-1000

> 循环数200,线程池参数:200-1000

| 最大线程数 ~ 最小线程数 | Thread(ms) | ThreadPool(ms) | Task(ms) | Parallel(ms) |
| 2047/1000 ~ 12/12 | 2712.09 | 8057.14 | 8585.01 | 7526.57 |
| 1000/1000 ~ 50/50 | 2733.25 | 2289.96 | 2218.29 | 3660.33 |
| 1000/1000 ~ 100/100 | 2503.08 | 1620.73 | 1534.50 | 1742.78 |
| 1000/1000 ~ 200/200 | 2999.27 | 1436.24 | 1150.21 | 935.22 |
四、结论
> Thread就像脱缰的野马,不受控制,创建多少就运行多少,可能少量时效率是高了,量大的时候除了性能没优势,还可能导致句柄泄露。
> ThreadPool与Task类似,但Task相比效率更高用法更灵活。
> Parallel自带了同步功能,不需要用信号量来做额外的同步等待。
> ThreadPool、Task、Parallel的性能都取决于线程池最大线程数和最小线程数。
> 推荐使用 Task 和 Parallel,具体用哪个可以参考用法自己斟酌。
.NET多线程知识快速学习的更多相关文章
- 第23篇 js快速学习知识
前面说了js的一些高级方面的基础知识,这些都是比较容易出错的和比较难理解的东西,除了这些之外其它的知识都比较简单了,基础学好了,扩展起来就是小意思.今天说说js方面可以快速学习和入门的知识. 1.闭包 ...
- 看我如何快速学习.Net(高可用数据采集平台)
最近文章:高可用数据采集平台(如何玩转3门语言php+.net+aauto).高并发数据采集的架构应用(Redis的应用) 项目文档:关键词匹配项目深入研究(二)- 分表思想的引入 吐槽:本人也是非常 ...
- 阿里巴巴Java开发手册快速学习
Java作为一门名副其实的工业级语言,语法友好,学习简单,大规模的应用给代码质量的管控带来了困难,特别是团队开发中,开发过程中的规范会直接影响最终项目的稳定性. 善医者“未有形而除之”,提高工程健壮性 ...
- Javaweb快速学习
孙卫琴老师的javaweb一书已经买了很多年,由于很厚一直也没有去好好阅读下, 项目发布后有闲暇时间,决定快速学习了,毕竟很多概念和知识主要还是复习. 对于互联网,我们可以简单认为浏览器就是会人类语言 ...
- Vue 超快速学习
Vue 超快速学习 基础知识: 1.vue的生命周期: beforeCreate/created. beforeMount/mounted. beforeUpdate/updated. beforeD ...
- 20155321 《信息安全系统设计》Linux多线程的深入学习
再次学习之多线程 基本概念的再次学习 线程是程序执行的最小单位(进程是资源管理的最小单位),线程隶属于某个进程中 进程有自己的数据段.代码段和堆栈段.线程通常叫做轻型的进程,每个线程共享其所附属进程的 ...
- 一点记忆—— Java框架知识的学习有感
一点记忆—— Java框架知识的学习有感 说一下自己学习的框架知识的历程吧:好久了,应该是一年前,也就是大三上的时候,我对于基本的 Java编程就已经达到所谓的“熟练”,认为自己可以在 ...
- (*)(转)要快速学习SSM框架,你需要一套学习曲线平滑的教程
作者:meepo链接:https://www.zhihu.com/question/57719761/answer/156952139来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...
- 【原创】docker在Ubuntu下1小时快速学习
前言 由于工作原因,很多情况下需要快速学习新的知识,针对docker如果从头到尾看相关书籍学习会非常慢,所以整理了下docker的常用操作,只要跟着本文学习操作,一小时就能掌握docker大部最常用分 ...
随机推荐
- 在Atmel Studio7中创建ASF项目
使用ASF自带例程的方式创建程序是很方便,但是因为系统例程支持的ATMEL开发板往往和用户板配置不同,所以我们需要自己创建项目.下面介绍在AS7.0中快速创建一个ASF项目的方法. 1.首先从菜单开始 ...
- .NET 中数据访问用的 DBHelper(Sql Server) 类
public class DBHelper { private static string DBConnectString = "Data Source=.;Initial Catalog= ...
- Django模型层—ORM
目录 一.模型层(models) 1-1. 常用的字段类型 1-2. 字段参数 1-3. 自定义char字段 1-4. 外键关系 二.Django中测试脚本的使用 三.单表操作 3-1. 添加记录 3 ...
- Python连载58-http协议简介
一.http协议实战 1.URL(Uniform Resource Located) (1)使用FFTP的URL,例如:ftp://rtfm.mit.edu (2)使用HTTP的URL,例如:http ...
- 微信小程序 存储数据到本地以及本地获取数据
1.wx存储数据到本地以及本地获取数据 存到本地就是存到你的手机 wx.setStorageSync与wx.setStorage 1.1 wx.setStorageSync(string key, a ...
- Litho在美团动态化方案MTFlexbox中的实践
1. MTFlexbox MTFlexbox是美团内部应用的非常成熟的一种跨平台动态化解决方案,它遵循了CSS3中提出的Flexbox规范来抹平多平台的差异.MTFlexbox适用于重展示.轻交互的业 ...
- Nginx配置实例-负载均衡实例:平均访问多台服务器
场景 Nginx配置实例-反向代理实例:根据访问的路径跳转到不同端口的服务中: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10 ...
- 软件开发工具(第13章: Eclipse插件的使用与开发)
一.插件简介 插件的定义(了解) 插件是一种遵循其所依附的软件的接口规范所编写出来的程序. 插件实际上是对原有软件的扩展,替应用程序增加一些所需要的特定 功能. 插件的构成(重点.记忆) 每个插件都由 ...
- javascript学习总结之函数
前言 在学习javascript函数的时候,有几个经常很容易混淆的方法,call,apply,bind,caller,callee,这些方法的使用,这些也可以说是会频繁使用的一些方法,在此通过查阅相关 ...
- pycharm查看函数用法,参数信息的设置方法
在编写python程序时,常常会遇到一些不太常见的函数,有时候又不想去百度,那么,使用pycharm设置快速显示函数的参数和用法,这个方法十分快捷方便. step1. file -> setti ...