.NET进阶篇06-async异步、thread多线程1
知识需要不断积累、总结和沉淀,思考和写作是成长的催化剂
异步多线程挺大一块内容,既想拆开慢慢学,又想一股脑全倒出。纠结再三,还是拆开吃透,也不至于篇幅过长,劝退许多人
本篇先做一个概述,列明一些基本概念
内容目录
一、进程和线程1、进程2、线程多线程后台线程3、简言之4、适用场景二、同步和异步1、同步2、异步3、异步编程4、Async、Await5、异步操作优缺点三、小结
一、进程和线程
1、进程
我们打开计算机的任务管理器,会发现系统的很多个进程,每个进程独占CPU、内存、磁盘、网络等资源,是资源分配的最小单元。多个进程之间是资源隔离的,数据之间不能直接传递。一个exe运行一次就会产生一个进程,运行多次就多个,但他们之间数据互相隔离

2、线程
同样在任务管理器中我们也能看到线程,一个进程是由多个线程组成的,且至少是由一个线程,那就是主线程。图中就可以看到线程的数量要比进程大的多

多线程
衡量一个人干活快,要么是一件事干的很快,要么是他能同时干很多事。计算机就是如此,以单核CPU类比单个人,理论上单位时间上只能运行一个进程里一个线程,只能干一件事。但线程有可能在某些操作比如读写磁盘时会等待,这时候磁盘在疯狂的运转,CPU却是闲置状态,直到磁盘读写完成才CPU才继续工作,所以空闲的这个时候它可以先去干别的事情,看起开就像单核它也可以同时干很多事
一个人可以把水壶烧上水的同时去拖地,同一时刻一个人是只能干一件事的,只是在快速的频繁切换,拖地时一直想着水开了没开了没,但如果处理不当,多线程效率还低,就像你没来及去倒已经烧开的水导致干锅,还有些任务同时起来更费时,就像你一边拖地一遍广播体操一样,伸展运动123然后拖一下地,然后接着,唉?到哪里了…
后台线程
后台线程不会阻止进程的关闭。当某个程序的所有前台线程完成后,进程就终止程序退出了,当然后台线程也会随即停止。在.NET中用Thread创建的线程默认都是前台线程,用线程池、BeginXXX等启用的线程都是后台线程
3、简言之
线程是独立执行单元,同一段代码(参数不同,任务不同)可以交给多个线程去执行,从宏观上看就是并行的执行,微观上时间片上还是串行执行的。但多核CPU就另说了,像多个人一样,一个人负责做饭,一个负责拖地
多线可以提高CPU的利用率,一个线程等待时,可以先去执行其他的任务,当然,线程之间的切换也是需要消耗资源的,开发复杂度也是会变大的,资源争夺也需要做合理的控制,也并不是所有的任务都适合多线程
4、适用场景
后台执行耗时任务,前台界面仍需要友好的展示。在WinForm中,如果单线程(也就是主线程)如果执行耗时的操作,那么界面就会失去响应,它忙于后台的任务,无法更新用户界面的交互。这个时候可以另开一个工作线程来处理耗时的任务,主线程可以响应用户操作,也可以随时改变任务的状态
在没有界面的程序里,当一个任务有潜在的耗时时,比如等待远程服务器的响应返回,用工作线程来完成任务可以让主线程去做其他事情
复杂的计算,多线程在多核CPU上可以更快的完成任务。总之一切都是为了效率,.NET中很多暗中的多线程,比如timer,backgroudworker,webservices等,我们使用中自然而然就在利用其多线程带来的好处,在了解了基本原理后,我们需要手动创建管理明面上的多线程任务
多线程纵然可以提高你的程序流畅度,但开发调试中确实增大了难度,一方面除了要对业务划分适应多线程的处理模式,另一个方面多线程最终还是交于操作系统的调度,我们虽可以执行一些优化调度,但最终结果并不是总尽人意,线程之间的切换也会消耗资源,所以多线程的设计应该尽量简单
二、同步和异步
1、同步
同步方法调用在程序继续执行之前需要等待同步方法执行完毕返回结果,程序自上而下顺序执行,没完成一个指令,在进行下一个指令。在代码调试的表现为,光标一步一步完成上一步计算后,才会进入下一行。阻塞调用线程的运行
2、异步
异步方法则在被调用之后,调用线程不会等待方法的完成,会直接进入下一行,执行下一个指令,所以是非阻塞的
3、异步编程
.NET通过委托可以实现异步调用任何方法。像上面介绍委托方法调用时,除了Invoke同步方法,还有BegInvoke异步方法,它会启用一个异步调用线程,你只需要传入委托方法的参数(可能还需要线程额外参数,如果有必要的话)就可以以后台线程的方式执行方法。在代码上执行到BeginInvoke时,会立即返回,不等待异步调用的完成,它返回一个IAsyncResult类型,你可以用它来监视调用的进度。和BegInvoke成对的EndInvoke方法可以用于获取异步调用的结果,这是会阻塞的。具体将在下一篇代码实例中讲解BeginInvoke的常用套路
4、Async、Await
Async、Await是.NET4.5新增的异步编程方式,为了简化异步程序的编写。上面的说的异步调用方式就是经典的APM异步编程模型,基于IAsyncResult接口实现BeginXXX和EndXXX类似的方法。在.NET4.5中可以使用Async方式,通过Async关键字标记方法为异步方法,然后在方法内部通过await标记后面的方法耗时,调用线程到这里就回去吧。我们就可以不用APM方式,用async方式可以轻松将一个方法编程异步方法
public async void Async1()
{
HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create("http://cnblogs.com/");
await myReq.GetRequestStreamAsync();
//to do
}
5、异步操作优缺点
异步操作相比较于多线程,减少了死锁的可能,在设计良好的情况下,异步函数可以不必使用共享变量,可以减少出错的几率。但起步也是难以调试的,只有尽量减少其复杂度
三、小结
这篇主要介绍一些概念,接下来硬核编码部分就不会再啰嗦这些,上面有遗漏的,在编码中会捎带一些。基本就这些吧,TaskFactory、ThreadPool、Task、Parallel等都是对Thread的封装,过一遍代码,了解常用方法套路就可以。不会面面俱到每个接口都试一下,微软官网文档更全面(吹一波,.NET微软大佬的技术支持还是杠杠的)。后面主要搞一些成熟的套路,比如线程的同步,线程取消,异常处理,线程安全、锁机制等可用的编码方式。
OK,那下期见,去给FPX打气去,拜了个拜~
可关注主页公号获取更多
兽人永不为奴

.NET进阶篇06-async异步、thread多线程1的更多相关文章
- 02: tornado进阶篇
目录:Tornado其他篇 01: tornado基础篇 02: tornado进阶篇 03: 自定义异步非阻塞tornado框架 04: 打开tornado源码剖析处理过程 目录: 1.1 自定制t ...
- .NET进阶篇06-async异步、thread多线程4
知识需要不断积累.总结和沉淀,思考和写作是成长的催化剂 梯子 一.锁1.lock2.Interlocked3.Monitor4.SpinLock5.Mutex6.Semaphore7.Events1. ...
- C#异步和多线程以及Thread、ThreadPool、Task区别和使用方法
本文的目的是为了让大家了解什么是异步?什么是多线程?如何实现多线程?对于当前C#当中三种实现多线程的方法如何实现和使用?什么情景下选用哪一技术更好? 第一部分主要介绍在C#中异步(async/awai ...
- c# 异步( Async ) 不是多线程
c# 异步( Async ) 不是多线程 误解 async 在调试 xxxxAsync() 方法的时候,常常会看到调试器界面中会多出一些线程,直觉上误认为 Async 冠名的函数是多线程. 对于 ...
- spring boot(17)-@Async异步
验证码的异步机制 上一篇讲过可以用邮件发验证码,通常我们在某网站发验证码时,首先会提示验证码已发送,请检查邮箱或者短信,这就是图中的1和3.然而此时查看邮箱或短信可能并没有收到验证码,往往要过几秒种才 ...
- PowerBuilder编程新思维2:嵌入(Thread多线程)
PowerBuilder编程新思维2:嵌入(Thread多线程) 在PB中使用多线程,在网上有大量的文章介绍.不过深入研究并试着给出更易用的模型的,目前还只有"路人甲cw"的一篇& ...
- Node.js进阶篇-koa、钩子函数、websocket、嵌入式开发
代码地址如下:http://www.demodashi.com/demo/12932.html 一.简介 koa是由Express原班人马打造的,致力于成为一个更小.更富有表现力.更健壮的We ...
- 在 .NET 4.0 下编写扩展代码以支持 async 异步编程
微软在C# 5中引入了async.await这两个异步编程的关键字,要使用这两个关键字需要你的IDE支持C#5.0语法,也就意味着你需要使用VS 2012版本以上IDE,或者在Vs2010卸载其编译器 ...
- Oracle RMAN 学习:演练进阶篇
Oracle RMAN 学习:演练进阶篇 5 Rman备份演练进阶篇 5.1 是否选择增量备份 Backup命令生成的备份集中只备份了那些使用了的数据块,备份集实际大小已经较目标数据库的数据文件小了很 ...
- Spring Boot (18) @Async异步
通常我们在某网站发送邮件验证码时,首先会提示验证码已发送,然而此时可能没有收到验证码,过几秒种才真正的收到.如果是同步会先验证发送是否成功然后再通知,如果是异步可以先通知用户已发送,并释放请求,然后再 ...
随机推荐
- laravel 5.5 运行在 php7.0 报错 Symfony\Component\Translation\Translator.php FatalThrowableErrorParse error: syntax error, unexpected '?', expecting variable (T_VARIABLE)
问题描述 报错原因是 php-cli 版本是 7.1.x,运行 composer create-project ... 命令时安装的依赖包会自动适配到当前 php 版本 7.1.x.如果 php-fp ...
- 线程、进程概念与Android系统组件的关系
Android系统是Google公司基于Linux内核开发的开源手机操作系统.通过利用 Linux 内核的优势,Android 系统使用了大量操作系统服务,包括进程管理.内存管理.网络堆栈.驱动程序. ...
- 开发一个带UI的库(asp.net core 3.0)
在GitHub上有个项目,本来是作为自己研究学习.net core的Demo,没想到很多同学在看,还给了很多星,所以觉得应该升成3.0,整理一下,写成博分享给学习.net core的同学们. 项目名称 ...
- mac下idea中安装docker插件
idea中安装docker插件: 点击Intellij IDEA->Preferences...->Plugins->Browse repositories...如下: 点击Inst ...
- day 19作业
目录 今日作业: 今日作业: 1.什么是对象?什么是类? 答:对象是特征与技能的集合体,类是一系列对象相同的特征与技能的结合体 2.绑定方法的有什么特点 答:由对象来调用称之为对象的绑定方法,不同的对 ...
- 网页布局——grid弹性网格布局
网格布局(Grid)是最强大的 CSS 布局方案. Flexbox 是为一维布局设计的,而 Grid 是为二维布局设计. grid目前兼容性目前还可以,主流浏览器对它的支持力度很大,ie9,10宣布它 ...
- 超炫酷的 IntelliJ IDEA 插件(一)
工善其事必先利器 打开setting文件选择Plugins选项 Ctrl + Alt + S File -> Setting 我的idea是最新版本2019.02 有的和别人界面可能不一样 主界 ...
- Be Nice!要善良
[1] It is nice to be important, but it is more important to be nice. [2] What simple act of kindne ...
- 树莓派(4B)Linux + .Net Core嵌入式-初始化环境(一)
一.树莓派简单介绍 二.软&件准备 硬件:树莓派4B主机.电源线.TF卡&TF读卡器.PC 软件:win32diskimager(用于烧系统到TF卡).Xshell或Windows T ...
- 5分钟读懂Linux权限管理
权限管理: 本文用于初学者对Linux文件系统权限的快速了解!! 进程安全上下文: 进程对文件的访问权限应用模型: 进程的属主与文件的属主是否相同:如果相同,则应用属主权限: 否 ...