多线程系列
文章平均质量分 91
yaopengfei系列之多线程系列
sinolover
完成项目,就要软硬兼施
展开
-
【转】温故之.NET 异步
转自:https://zhuanlan.zhihu.com/p/38537169这篇文章包含以下内容异步基础 基于任务的异步模式 部分 API 介绍异步基础所谓异步,对于计算密集型的任务,就是以线程为基础的多任务。而在具体使用中,使用线程池里面的线程还是新建独立线程,取决于具体的任务量;对于I/O密集型任务的异步,是以Windows事件为基础的。.NET提供了执行异步操作的三种方式:异步编程模型 (APM) 模式(也称IAsyncResult模式):在此模式中异步操作...原创 2021-07-15 13:47:48 · 184 阅读 · 0 评论 -
【转】谈谈c#中异步编程模型的变迁**
大家在编程过程中都会用到一些异步编程的情况。在c#的BCL中,很多api都提供了异步方法,初学者可能对各种不同异步方法的使用感到迷惑,本文主要为大家梳理一下异步方法的变迁以及如何使用异步方法。BeginXXX,EndXXX模式在.Net Framework 2.0中,最常见的方法是BeginXXX,和EndXXX这样的方法来搭配使用。这种模式可以概括为方法+回调函数模式或者称为InvokeMethod+EventHandler模式。这种模型的基本流程是:调用BeginXXX方法 Begin原创 2021-01-16 16:39:08 · 189 阅读 · 0 评论 -
【转】Difference between TPL and TAP
Q:I want to clarify the difference between two these abbreviations:TPL(a task parallel library) andTAP(task async pattern).AFAIU,TPL- is a task parallel library and the main part of this library isTaskand all related staff. So, it's like a techn...原创 2020-12-01 14:58:20 · 299 阅读 · 0 评论 -
【转】探索c#之Async、Await剖析
阅读目录:基本介绍 基本原理剖析 内部实现剖析 重点注意的地方 总结基本介绍Async、Await是net4.x新增的异步编程方式,其目的是为了简化异步程序编写,和之前APM方式简单对比如下。APM方式,BeginGetRequestStream需要传入回调函数,线程碰到BeginXXX时会以非阻塞形式继续执行下面逻辑,完成后回调先前传入的函数。 HttpWebRequest myReq =(HttpWebRequest)WebRequest.Create("http:原创 2020-11-24 16:44:15 · 546 阅读 · 0 评论 -
【转】WebApi中的C#await / async,重点是什么?
有人知道这样做的目的是什么?private async Task<bool> StoreAsync(TriviaAnswer answer) { ... } [ResponseType(typeof(TriviaAnswer))] public async Task<IHttpActionResult> Post(TriviaAnswer answer) { var isCorrect = await StoreAsync(answer); return..原创 2020-11-24 16:41:13 · 1381 阅读 · 0 评论 -
【转】C# 彻底搞懂async/await
关键:异步方法:在执行完成前立即返回调用方法,在调用方法继续执行的过程中完成任务。async/await 结构可分成三部分: (1)调用方法:该方法调用异步方法,然后在异步方法执行其任务的时候继续执行; (2)异步方法:该方法异步执行工作,然后立刻返回到调用方法; (3)await 表达式:用于异步方法内部,指出需要异步执行的任务。一个异步方法可以包含多个 await 表达式(不存在 await 表达式的话 IDE 会发出警告)。一、What's 异步?...原创 2020-11-24 16:37:56 · 1741 阅读 · 0 评论 -
【转】Task和async/await详解
一、什么是异步 同步和异步主要用于修饰方法。当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法;当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务,调用者不用等待该方法执行完毕,我们称这个方法为异步方法。 异步的好处在于非阻塞(调用线程不会暂停执行去等待子线程完成),因此我们把一些不需要立即使用结果、较耗时的任务设为异步执行,可以提高程序的运行效率。net4.0在ThreadPool的基础上推出了Task类,微软极力推荐使用Task来执行异步原创 2020-11-24 16:11:43 · 636 阅读 · 0 评论 -
c#中的BeginInvoke和EndEndInvoke 摘要
C#基础]c#中的BeginInvoke和EndEndInvoke摘要异步这东西,真正用起来的时候,发现事情还是挺多的,最近在项目中用到了异步的知识,发现对它还是不了解,处理起来,走了不少弯路。觉得还是补一补还是很有必要的。MSDN原文地址:https://msdn.microsoft.com/en-us/library/2e08f6yc(v=vs.110).aspx正文.Net fra...原创 2020-02-28 20:12:12 · 519 阅读 · 0 评论 -
NET 提供了执行异步操作的三种模式
1.APM模式简介在.net1.x的版本中就可以使用IAsyncResult接口实现异步操作,但是比较复杂,这种称之为异步编程模型模式 (Asynchronous Programming Model, APM),也称为IAsyncResult模式在这种APM模式下,一个同步操作XXX需要定义BeginXXX方法和EndXXX方法。例如,如果有一个同步方法DownloadString,其异步版...原创 2020-02-28 22:44:42 · 482 阅读 · 0 评论 -
进程、线程和协程的理解
进程、线程和协程之间的关系和区别也困扰我一阵子了,最近有一些心得,写一下。进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的)。协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显式调度。进程和其他两个的区别还是很明显的。协程和线程的区别是:协程避免了无意义的调度,由...原创 2020-03-07 10:41:22 · 215 阅读 · 0 评论 -
C#.NET Thread多线程并发编程学习与常见面试题解析-1、Thread使用与控制基础
前言:因为平时挺少用到多线程的,写游戏时都在用协程,至于协程那是另一个话题了,除了第一次学习多线程时和以前某个小项目有过就挺少有接触了,最近准备面试又怕被问的深入,所以就赶紧补补多线程基础。网上已经有很多线程编程的学习笔记了,那我为什么还要再整理一篇呢。因为我在搜索网上文章的时候发现一般别人整理的面试文章那很多语法都一笔带过了默认大家都懂,学习文章又很少有给出经典的题目,一般都是要几篇集合着一...原创 2020-03-08 07:56:29 · 891 阅读 · 0 评论 -
第十四节: 介绍四大并发集合类并结合单例模式下的队列来说明线程安全和非安全的场景及补充性能调优问题。
一. 四大并发集合类背景:我们目前使用的所有集合都是线程不安全的。 A. ConcurrentBag:就是利用线程槽来分摊Bag中的所有数据,链表的头插法,0代表移除最后一个插入的值. (等价于同步中的List) B. ConcurrentStack:线程安全的Stack是使用Interlocked来实现线程安全, 而没有使用内核锁. (等价于同步中的数组) C...原创 2020-02-29 07:54:23 · 159 阅读 · 0 评论 -
第十三节:实际开发中使用最多的监视锁Monitor、lock语法糖的扩展、混合锁的使用(ManualResetEvent、SemaphoreSlim、ReaderWriterLockSlim)
一. 监视锁(Monitor和lock)1. Monitor类,限定线程个数的一把锁,两个核心方法: Enter:锁住某个资源。 Exit:退出某一个资源。测试案例:开启5个线程同时对一个变量进行自增操作,结果变量有序的输出,说明该锁同时只允许一个线程访问。但是写法很麻烦,每次都要try-catch-finally,还要声明bool变量。这个时候lock语法糖就很好的解决了...原创 2020-02-29 07:53:03 · 294 阅读 · 0 评论 -
深入理解happens-before和as-if-serial语义
本文大部分整理自《Java并发编程的艺术》,温故而知新,加深对基础的理解程度。下面可以和小编来一起学习下概述本文大部分整理自《Java并发编程的艺术》,温故而知新,加深对基础的理解程度。指令序列的重排序我们在编写代码的时候,通常自上而下编写,那么希望执行的顺序,理论上也是逐步串行执行,但是为了提高性能,编译器和处理器常常会对指令做重排序。1) 编译器优化的重排序。编译器在不改...原创 2020-02-23 12:17:35 · 724 阅读 · 0 评论 -
C#异步编程-------异步编程模型(APM)
术语解释:APM异步编程模型,Asynchronous Programming ModelEAP基于事件的异步编程模式,Event-based Asynchronous PatternTAP基于任务的异步编程模式,Task-based Asynchronous Pattern一...原创 2020-02-22 17:39:06 · 1007 阅读 · 0 评论 -
从编译到执行,C++如何开发SIMD友好的代码?
一:名词解释Flynn分类法Flynn于1972年提出了计算平台的Flynn分类法,主要根据指令流和数据流来分类。按照Flynn分类法,计算平台共分为四种类型。1.单指令流单数据流机器(SISD)2.单指令流多数据流机器(SIMD)3.多指令流单数据流机器(MISD)4.多指令流多数据流机器(MIMD)标量处理器标量处理器是一...原创 2020-03-02 10:10:42 · 1208 阅读 · 0 评论 -
C#异步编程模型
什么是异步编程模型异步编程模型(Asynchronous Programming Model,简称APM)是C#1.1支持的一种实现异步操作的编程模型,虽然已经比较“古老”了,但是依然可以学习一下的。通过对APM的学习,我总结了以下三点:1. APM的本质是使用委托和线程池来实现异步编程的。2.实现APM的关键是要实现IAsyncResult接口。3. 实现了APM的类都会定义一...原创 2020-02-20 10:21:02 · 701 阅读 · 0 评论 -
四种并发编程模型简介
概述并发往往和并行一起被提及,但是我们应该明确的是“并发”不等同于“并行”• 并发:同一时间 对待 多件事情 (逻辑层面)• 并行:同一时间 做(执行) 多件事情 (物理层面)并发可以构造出一种问题解决方法,该方法能够被用于并行化,从而让原本只能串行处理的事务并行化,更好地发挥出当前多核CPU,分布式集群的能力。但是,并...原创 2020-03-02 10:10:36 · 752 阅读 · 0 评论 -
C#多线程编程
一:线程与进程的概念1概念进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.2.关系...原创 2020-02-23 12:15:11 · 178 阅读 · 0 评论 -
C#线程模型脉络
今天在看同事新买到的《C#本质论 Edition 4》的时候,对比下以前Edtion3的新特性时,针对Async/Await关键字时发现对一些线程方面的定义还理解的不是很透彻,脉络还不是很清晰,这样有了本文,希望对有同样困惑的朋友有些帮助。文中部分内容摘取自《Essential C# 5.0 Edition 4》,还有一些我个人的对线程方面知识的理解与概括,如果有错误的地方还请...原创 2020-02-18 06:41:41 · 359 阅读 · 0 评论 -
.NET三种异步模式(APM、EAP、TAP)
APM模式:.net 1.0时期就提出的一种异步模式,并且基于IAsyncResult接口实现BeginXXX和EndXXX类似的方法。.net中有很多类实现了该模式(比如HttpWebRequest),同时我们也可以自定义类来实现APM模式(继承IAsyncResult接口并且实现BeginXXX和EndXXX方法) 1 /// <summary> 2 ...原创 2020-03-02 10:10:31 · 1864 阅读 · 0 评论 -
async & await 的前世今生(Updated)
async 和 await 出现在C# 5.0之后,给并行编程带来了不少的方便,特别是当在MVC中的Action也变成async之后,有点开始什么都是async的味道了。但是这也给我们编程埋下了一些隐患,有时候可能会产生一些我们自己都不知道怎么产生的Bug,特别是如果连线程基础没有理解的情况下,更不知道如何去处理了。那今天我们就来好好看看这两兄弟和他们的叔叔(Task)爷爷(Thread)们到底...原创 2020-02-20 11:18:06 · 172 阅读 · 0 评论 -
TPL 和传统 .NET Framework 异步编程
.NET Framework 提供了以下两种标准模式,用于执行 I/O 密集型和计算密集型异步操作: 异步编程模型 (APM),其中异步操作由一对 Begin/End 方法(如FileStream.BeginRead和Stream.EndRead)表示。 基于事件的异步模式 (EAP),其中异步操作由 OperationName Async 和 OperationName Co...原创 2020-02-18 06:44:36 · 241 阅读 · 0 评论 -
异步、多线程、任务、并行编程之一:选择合适的多线程模型
本篇概述:@FCL4.0中已经存在的线程模型,以及它们之间异同点;@多线程编程模型的选择。1:异步、多线程、任务、并行的本质这四个概念对应在CLR中的本质,本质都是多线程。异步,简单的讲就是BeginInvoke、EndInvoke模式,它在CLR内部线程池进行管理;多线程,体现在C#中,可以由类型Thread发起。也可以由ThreadPool发起。前者不受CLR线程池...原创 2020-02-20 10:23:59 · 233 阅读 · 0 评论 -
windows程序消息机制(Winform界面更新有关)
1. Windows程序消息机制 Windows GUI程序是基于消息机制的,有个主线程维护着消息泵。这个消息泵让windows程序生生不息。 Windows程序有个消息队列,窗体上的所有消息是这个队列里面消息的最主要来源。这里的While循环使用了GetMessage() 这个方法,这是个阻塞方法,也就是队列为空时方法就会阻塞,从而这个While循环停止运动,这避免了...原创 2020-03-09 10:00:38 · 321 阅读 · 0 评论 -
C#多线程编程系列(五)- 浅析C# Dictionary实现原理
目录一、前言 二、理论知识 1、Hash算法 2、Hash桶算法 3、解决冲突算法 三、Dictionary实现 1. Entry结构体 2. 其它关键私有变量 3. Dictionary - Add操作 4. Dictionary - Find操作 5. Dictionary - Remove操作 6. Dictionary - Resize操作(扩容...原创 2020-03-01 18:19:04 · 1510 阅读 · 1 评论 -
C#多线程编程系列(五)- C# ConcurrentBag的实现原理
目录一、前言 二、ConcurrentBag类 三、 ConcurrentBag线程安全实现原理 1. ConcurrentBag的私有字段 2. 用于数据存储的ThreadLocalList类 3. ConcurrentBag实现新增元素 4. ConcurrentBag 如何实现迭代器模式 四、总结 笔者水平有限,如果错误欢迎各位批评指正!一、前言#笔者最近...原创 2020-03-01 18:18:57 · 947 阅读 · 0 评论 -
C#多线程编程系列(五)- 使用任务并行库
目录1.1 简介 1.2 创建任务 1.3 使用任务执行基本的操作 1.4 组合任务 1.5 将APM模式转换为任务 1.6 将EAP模式转换为任务 1.7 实现取消选项 1.8 处理任务中的异常 1.9 并行运行任务 1.10 使用TaskScheduler配置任务执行 参考书籍 笔者水平有限,如果错误欢迎各位批评指正!本系列首页链接:[C#多线程编程系列(一)- 简...原创 2020-02-20 10:30:44 · 525 阅读 · 0 评论 -
C#多线程编程系列(四)- 使用线程池
目录1.1 简介 1.2 在线程池中调用委托 1.3 向线程池中放入异步操作 1.4 线程池与并行度 1.5 实现一个取消选项 1.6 在线程池中使用等待事件处理器及超时 1.7 使用计时器 1.8 使用BackgroundWorker组件 参考书籍 笔者水平有限,如果错误欢迎各位批评指正!1.1 简介#在本章中,主要介绍线程池(ThreadPool)的使用;在C#中它...原创 2020-02-17 09:41:58 · 277 阅读 · 0 评论 -
C#多线程编程系列(三)- 线程同步
目录1.1 简介 1.2 执行基本原子操作 1.3 使用Mutex类 1.4 使用SemaphoreSlim类 1.5 使用AutoResetEvent类 1.6 使用ManualResetEventSlim类 1.7 使用CountDownEvent类 1.8 使用Barrier类 1.9 使用ReaderWriterLockSlim类 1.10 使用SpinWait类 ...原创 2020-02-17 09:41:10 · 490 阅读 · 0 评论 -
C#多线程编程系列(二)- 线程基础
目录C#多线程编程系列(二)- 线程基础 1.1 简介 1.2 创建线程 1.3 暂停线程 1.4 线程等待 1.5 终止线程 1.6 检测线程状态 1.7 线程优先级 1.8 前台线程和后台线程 1.9 向线程传递参数 1.10 C# Lock关键字的使用 1.11 使用Monitor类锁定资源 1.12 多线程中处理异常 参考书籍 笔...原创 2020-02-17 09:40:31 · 386 阅读 · 0 评论 -
C#多线程编程系列(一)- 简介
目录系列大纲 一、前言 二、目录结构 四、章节结构 五、相关链接系列大纲#目前只整理到第二章,线程同步,笔者后面会慢慢更新,争取能把这本书中精华的知识都分享出来。C#多线程编程系列(一)- 简介C#多线程编程系列(二)- 线程基础C#多线程编程系列(三)- 线程同步C#多线程编程系列(四)- 使用线程池C#多线程编程系列(五)- 使用任务并行库源码下载点击链接示例源码下载...原创 2020-02-17 09:39:57 · 277 阅读 · 0 评论 -
c#多线程总结(纯干货)
线程基础创建线程static void Main(string[] args){ Thread t = new Thread(PrintNumbers); t.Start();//线程开始执行 PrintNumbers(); Console.ReadKey();}static void PrintNumbers(){ Consol...原创 2020-03-27 13:18:48 · 1154 阅读 · 0 评论 -
.NET异步程序设计之任务并行库
目录1.简介 2.Parallel类 2.0 Parallel类简介 2.1 Parallel.For() 2.2 Parallel.ForEach() 2.3 Parallel.Invoke() 2.4 补充:线程安全集合 3.Task类 3.0 Task类简介 3.1 创建无返回值的Task任务 3.2 创建有返回值的Task任务 3.3 为Task...原创 2020-02-29 07:59:56 · 567 阅读 · 0 评论 -
那些年我们一起追逐的多线程(Thread、ThreadPool、委托异步调用、Task/TaskFactory、Parallerl、async和await)
一. 背景 在刚接触开发的头几年里,说实话,根本不考虑多线程的这个问题,貌似那时候脑子里也有没有多线程的这个概念,所有的业务都是一个线程来处理,不考虑性能问题,当然也没有考虑多线程操作一条记录存在的并发问题,后面随着处理的系统业务越来越复杂,多线程再也回避不了了,也就借此机会深入研究了一下.Net中的多线程的处理方案。 发现在.Net领域中,多线程的处理大致经历了这么几个阶段:Thr...原创 2020-02-18 06:54:14 · 412 阅读 · 0 评论 -
第十五节:深入理解async和await的作用及各种适用场景和用法
一. 同步VS异步1. 同步 VS 异步 VS 多线程同步方法:调用时需要等待返回结果,才可以继续往下执行业务异步方法:调用时无须等待返回结果,可以继续往下执行业务开启新线程:在主线程之外开启一个新的线程去执行业务同步方法和异步方法的本质区别:调用时是否需要等待返回结果才能继续执行业务2. 常见的异步方法(都以Async结尾) ① HttpClient类:Pos...原创 2020-02-29 07:56:02 · 1562 阅读 · 0 评论 -
第十二节:深究内核模式锁的使用场景(自动事件锁、手动事件锁、信号量、互斥锁、读写锁、动态锁)
一. 整体介绍温馨提示:内核模式锁,在不到万不得已的情况下,不要使用它,因为代价太大了,有很多种替代方案。 内核模式锁包括: ①:事件锁 ②:信号量 ③:互斥锁 ④:读写锁 ⑤:动态锁二. 事件锁事件锁包括:A. 自动事件锁(AutoResetEvent) 使用场景:可以用此锁实现多线程环境下某个变量的自增....原创 2020-02-23 12:15:44 · 258 阅读 · 0 评论 -
第十一节:深究用户模式锁的使用场景(异变结构、互锁、旋转锁)
一. 锁机制的背景介绍 本章节,将结合多线程来介绍锁机制,那么问题来了,什么是锁呢? 为什么需要锁? 为什么要结合多线程来介绍锁呢?锁的使用场景又是什么呢? DotNet中又有哪些锁呢? 在接下来的几个章节中,将陆续解答这些问题。PS: 多个线程对一个共享资源进行使用的时候,会出问题, 比如实际的业务场景,入库和出库操作同时进行,库存量就会存在并发问题。所以锁就是用来解决...原创 2020-02-29 07:47:53 · 414 阅读 · 0 评论 -
第十节:利用async和await简化异步编程模式的几种写法
一. async和await简介PS:简介1. async和await这两个关键字是为了简化异步编程模型而诞生的,使的异步编程跟简洁,它本身并不创建新线程,但在该方法内部开启多线程,则另算。2.这两个关键字适用于处理一些文件IO操作。3.好处:代码简介,把异步的代码写成了同步的形式,提高了开发效率。 坏处:如果使用同步思维去理解,容易出问题,返回值对不上。二....原创 2020-02-29 07:46:35 · 296 阅读 · 0 评论 -
第九节:深究并行编程Parallel类中的三大方法 (For、ForEach、Invoke)和几大编程模型(SPM、APM、EAP、TAP)
一. 并行编程1. 区分串行编程和串行编程 ①. 串行编程:所谓的串行编程就是单线程的作用下,按顺序执行。(典型代表for循环 下面例子从1-100按顺序执行) ②. 并行编程:充分利用多核cpu的优势,同时开启多个线程并行执行。(典型代表Parallel.For循环 下面例子从1-100无序执行)代码实践: 1 { 2 //1...原创 2020-02-29 07:35:32 · 314 阅读 · 0 评论