
同步异步系列
同步异步系列文章
sinolover
完成项目,就要软硬兼施
展开
-
【读书笔记】.Net并行编程高级教程--Parallel
一直觉得自己对并发了解不够深入,特别是看了《代码整洁之道》觉得自己有必要好好学学并发编程,因为性能也是衡量代码整洁的一大标准。而且在《失控》这本书中也多次提到并发,不管是计算机还是生物都并发处理着各种事物。人真是奇怪,当你关注一个事情的时候,你会发现周围的事物中就常出现那个事情。所以好奇心驱使下学习并发。便有了此文。一、理解硬件线程和软件线程 多核处理器带有一个以上的物理内核--物...原创 2020-02-21 09:46:21 · 250 阅读 · 0 评论 -
C#.Net使用线程池(ThreadPool)与专用线程(Thread)
线程池(ThreadPool)使用起来很简单,但它有一些限制:1. 线程池中所有线程都是后台线程,如果进程的所有前台线程都结束了,所有的后台线程就会停止。不能把入池的线程改为前台线 程。2. 不能给入池的线程设置优先级或名称。3. 对于COM对象,入池的所有线程都是多线程单元(Multi-threaded apartment,MTA)线程。许多COM对象都需要单线程单元(Single ...原创 2019-08-26 18:31:14 · 3499 阅读 · 0 评论 -
C#多线程和线程池
.Net的公用语言运行时(Common Language Runtime,CLR)能区分两种不同类型的线程:前台线程和后台线程。这两者的区别就是:应用程序必须运行完所有的前台线程才可以退出;而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束。前台线程和后台线程的区别和联系:1、后台线程不会阻止进程的终止。属于某个进程的所有前台线程都终...原创 2019-08-26 17:04:55 · 960 阅读 · 0 评论 -
C#多线程
一、基本概念1、进程首先打开任务管理器,查看当前运行的进程:从任务管理器里面可以看到当前所有正在运行的进程。那么究竟什么是进程呢?进程(Process)是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源。一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括一个或多个线程。线程是操作系统分配处理器时间的基本单元,在进程中可以有多个线程同时执行代...原创 2019-08-26 16:49:09 · 269 阅读 · 0 评论 -
c#之task与thread区别及其使用
1.什么是thread当我们提及多线程的时候会想到thread和threadpool,这都是异步操作,threadpool其实就是thread的集合,具有很多优势,不过在任务多的时候全局队列会存在竞争而消耗资源。thread默认为前台线程,主程序必须等线程跑完才会关闭,而threadpool相反。总结:threadpool确实比thread性能优,但是两者都没有很好的api区控制,如果线程执行...原创 2020-02-10 20:43:19 · 5570 阅读 · 1 评论 -
C# 彻底搞懂async/await
前言Talk is cheap, Show you the code first!private void button1_Click(object sender, EventArgs e){ Console.WriteLine("111 balabala. My Thread ID is :" + Thread.CurrentThread.ManagedThreadId...原创 2020-02-10 20:41:32 · 1065 阅读 · 1 评论 -
C# async 和 await 理解
先假设如下场景:主函数 Main,循环等待用户输入;计算函数 Cal,耗时计算大量数据;class Test { static int Main(string[] args) { while(true) { // 等待用户输入 } } public static int ...原创 2020-02-10 20:39:17 · 647 阅读 · 0 评论 -
第十五节:深入理解async和await的作用及各种适用场景和用法
一. 同步VS异步1. 同步 VS 异步 VS 多线程同步方法:调用时需要等待返回结果,才可以继续往下执行业务异步方法:调用时无须等待返回结果,可以继续往下执行业务开启新线程:在主线程之外开启一个新的线程去执行业务同步方法和异步方法的本质区别:调用时是否需要等待返回结果才能继续执行业务2. 常见的异步方法(都以Async结尾) ① HttpClient类:Pos...原创 2020-02-06 12:25:09 · 454 阅读 · 0 评论 -
第十四节: 介绍四大并发集合类并结合单例模式下的队列来说明线程安全和非安全的场景及补充性能调优问题。
一. 四大并发集合类背景:我们目前使用的所有集合都是线程不安全的。 A. ConcurrentBag:就是利用线程槽来分摊Bag中的所有数据,链表的头插法,0代表移除最后一个插入的值. (等价于同步中的List) B. ConcurrentStack:线程安全的Stack是使用Interlocked来实现线程安全, 而没有使用内核锁. (等价于同步中的数组) C...原创 2020-02-06 12:25:05 · 315 阅读 · 0 评论 -
第十三节:实际开发中使用最多的监视锁Monitor、lock语法糖的扩展、混合锁的使用(ManualResetEvent、SemaphoreSlim、ReaderWriterLockSlim)
一. 监视锁(Monitor和lock)1. Monitor类,限定线程个数的一把锁,两个核心方法: Enter:锁住某个资源。 Exit:退出某一个资源。测试案例:开启5个线程同时对一个变量进行自增操作,结果变量有序的输出,说明该锁同时只允许一个线程访问。但是写法很麻烦,每次都要try-catch-finally,还要声明bool变量。这个时候lock语法糖就很好的解决了...原创 2020-02-06 12:24:44 · 299 阅读 · 0 评论 -
第十二节:深究内核模式锁的使用场景(自动事件锁、手动事件锁、信号量、互斥锁、读写锁、动态锁)
一. 整体介绍温馨提示:内核模式锁,在不到万不得已的情况下,不要使用它,因为代价太大了,有很多种替代方案。 内核模式锁包括: ①:事件锁 ②:信号量 ③:互斥锁 ④:读写锁 ⑤:动态锁二. 事件锁事件锁包括:A. 自动事件锁(AutoResetEvent) 使用场景:可以用此锁实现多线程环境下某个变量的自增....原创 2020-02-06 12:24:21 · 331 阅读 · 0 评论 -
第十节:利用async和await简化异步编程模式的几种写法
一. async和await简介PS:简介1. async和await这两个关键字是为了简化异步编程模型而诞生的,使的异步编程跟简洁,它本身并不创建新线程,但在该方法内部开启多线程,则另算。2.这两个关键字适用于处理一些文件IO操作。3.好处:代码简介,把异步的代码写成了同步的形式,提高了开发效率。 坏处:如果使用同步思维去理解,容易出问题,返回值对不上。二....原创 2020-02-03 16:48:03 · 312 阅读 · 0 评论 -
第九节:深究并行编程Parallel类中的三大方法 (For、ForEach、Invoke)和几大编程模型(SPM、APM、EAP、TAP)
一. 并行编程1. 区分串行编程和串行编程 ①. 串行编程:所谓的串行编程就是单线程的作用下,按顺序执行。(典型代表for循环 下面例子从1-100按顺序执行) ②. 并行编程:充分利用多核cpu的优势,同时开启多个线程并行执行。(典型代表Parallel.For循环 下面例子从1-100无序执行)代码实践: 1 { 2 //1...原创 2020-02-03 16:47:23 · 512 阅读 · 0 评论 -
第八节:Task的各类Task<TResult>返回值以及通用线程的异常处理方案
一.Task的各种返回值-Task<TResult>PS:在前面章节,我们介绍了Task类开启线程、线程等待、线程延续的方式,但我们并没有关注这些方式的返回值,其实他们都是有返回值的Task<TResult>,然后可以通过Task的实例调用Result属性来获取这个返回值。 下面我们分三类来介绍: ①:线程开启类的返回值, 使用Task<TRe...原创 2020-02-03 16:45:52 · 2384 阅读 · 0 评论 -
第七节:利用CancellationTokenSource实现任务取消和利用CancellationToken类检测取消异常。
一. 传统的线程取消 所谓的线程取消,就是线程正在执行的过程中取消线程任务。 传统的线程取消,是通过一个变量来控制,但是这种方式,在release模式下,被优化从cpu高速缓存中读取,而不是从内存中读取,会造成主线程无法执行这一个bug。 1 { 2 var isStop = false; 3 var...原创 2020-02-03 16:45:16 · 953 阅读 · 1 评论 -
第六节:深入研究Task实例方法ContinueWith的参数TaskContinuationOptions
. 一、整体说明揭秘: 该章节的性质和上一个章节类似,也是一个扩展的章节,主要来研究Task类下的实例方法ContinueWith中的参数TaskContinuationOptions。 通过F12查看TaskContinuationOptions的源码,知道主要有这么几个参数: ①. LazyCancellation:在延续取消的情况下,防止延续的完成直到完成先前的任务。...原创 2020-02-03 16:42:38 · 969 阅读 · 0 评论 -
第五节:Task构造函数之TaskCreationOptions枚举处理父子线程之间的关系。
一. 整体说明揭秘: 通过F12查看Task类的源码(详见下面的截图),发现Task类的构造函数有有一个参数为:TaskCreationOptions类型,本章节可以算作是一个扩展章节,主要就来研究TaskCreationOptions类的作用。 该类主要用来处理父子线程之间的关系,重要的几个参数如下: ①.AttachedToParent:指定将任务附加到任务层次结构中...原创 2020-02-03 16:37:29 · 556 阅读 · 0 评论 -
第四节:Task的启动的四种方式以及Task、TaskFactory的线程等待和线程延续的解决方案
一. 背景揭秘: 在前面的章节介绍过,Task出现之前,微软的多线程处理方式有:Thread→ThreadPool→委托的异步调用,虽然也可以基本业务需要的多线程场景,但它们在多个线程的等待处理方面、资源占用方面、线程延续和阻塞方面、线程的取消方面等都显得比较笨拙,在面对复杂的业务场景下,显得有点捉襟见肘了。 正是在这种背景下,Task应运而生。 Task是微软在.Net ...原创 2020-02-03 16:36:48 · 940 阅读 · 0 评论 -
第三节:ThreadPool的线程开启、线程等待、线程池的设置、定时功能
一. ThreadPool简介 ThreadPool简介:ThreadPool是一个线程池,当你需要开启n个线程时候,只需把这个指令抛给线程池,它将自动分配线程进行处理,它诞生于.Net 2.0时代。 ThreadPool与Thread的区别: ①:Thread每开启一个异步任务,就需要使用一个Thread,具有专一性,即使Thread已经死掉,仍然需要占用资源。 ...原创 2020-02-03 16:32:24 · 638 阅读 · 0 评论 -
第二节:深入剖析Thread的五大方法、数据槽、内存栅栏
一. Thread及其五大方法 Thread是.Net最早的多线程处理方式,它出现在.Net1.0时代,虽然现在已逐渐被微软所抛弃,微软强烈推荐使用Task(后面章节介绍),但从多线程完整性的角度上来说,我们有必要了解下N年前多线程的是怎么处理的,以便体会.Net体系中多线程处理方式的进化。 Thread中有五大方法,分别是:Start、Suspend、Resume、Intterup...原创 2020-02-03 15:44:48 · 338 阅读 · 0 评论 -
第一节:复习委托,并且通过委托的异步调用开启一个新线程和异步回调、异步等待
一. 再谈委托1. 委托是一个关键字为delegate的自定义类型,通过委托可以把方法以参数的形式传递给另外一个方法,实现插件式的开发模式; 同时调用委托的时候,委托所包含的所有方法都会被实现。2. 委托的发展历史:new实例化传递方法→直接等于方法名→delegate匿名方法→省略delegate→省略括号中的参数→当只有一个参数省略小括号 →当方法体只有...原创 2020-02-03 15:32:22 · 262 阅读 · 0 评论 -
那些年我们一起追逐的多线程(Thread、ThreadPool、委托异步调用、Task/TaskFactory、Parallerl、async和await)
一. 背景 在刚接触开发的头几年里,说实话,根本不考虑多线程的这个问题,貌似那时候脑子里也有没有多线程的这个概念,所有的业务都是一个线程来处理,不考虑性能问题,当然也没有考虑多线程操作一条记录存在的并发问题,后面随着处理的系统业务越来越复杂,多线程再也回避不了了,也就借此机会深入研究了一下.Net中的多线程的处理方案。 发现在.Net领域中,多线程的处理大致经历了这么几个阶段:Thr...原创 2020-01-09 09:34:40 · 213 阅读 · 0 评论