异步编程简介
前言
本人学习.Net两年有余,是第一次写博客,虽然写的很认真,当毕竟是第一次,确定会有不少不足之处,
但愿你们照顾照顾新人,有错误之处能够指出来,我会虚心接受的。html
何谓异步
- 与同步相对应,异步指的是让CPU暂时搁置当前请求的响应,处理下一个请求,当经过轮询或其余方式获得回调通知后,
开始运行。多线程将异步操做放入另外一线程中运行,经过轮询或回调方法获得完成通知,可是完成端口,由操做系统接管
异步操做的调度,经过硬件中断,在完成时触发回调方法,此方式不须要占用额外线程。
- 异步编程正在被使用的的愈来愈多,主要就是解决处理并发方面;那什么是并发呢?并发指的就是某个时间段,多个用户同时访问
形成的阻塞现象。不少人都有个误解,以为异步编程能缩短咱们处理某个任务的时间,其实并无.
异步与多线程的异同点
- 二者均可以达到避免调用线程阻塞的目的,异步使用的是线程池中的线程,没有额外的线程负担,
而且使用回调的方式进行处理,与普通人的思惟方式有些出入,并且难以调试。多线程的处理方式
依然是顺序执行,符合常人的思惟方式,因此编程较简单,但会带来额外的线程负担,而且线程间
的共享变量可能会形成死锁的出现。并且线程也是对象也须要占用内存,所以线程月多占用内存也
越多,多线程能缩短某个处理任务的时间,异步编程则不能。
理解多线程
- 在某个时间段,也许咱们想缩短咱们处理某个任务的时间,这个时候毫不是使用
异步,而是使用多线程。举个例子,超市大减价期间去购物的话,每条结帐队伍都会
排了几十人,假设你购物须要20分钟,结帐就要排队20分钟,这样你就要40分钟才能
购物完毕。这个时候就要开启多线程,你叫你的朋友去结帐哪里排队,而你就去购物,
这样当你购完物时就恰好到你结帐的时候,这样你就只须要20分钟就能购物完毕,足足
减小了20分钟,这就是多线程编程
多线程扩展知识点
- 多个线程之间经过抢得处理器时间来执行,例如,A线程执行300毫秒后,可能会轮到
B线程执行,A线程会暂停(挂起);当B线程执行一段时间后,又轮到A线程继续执行。因为
处理器时间片很短,人们很难察觉,好像某个线程一直在执行同样.
为何要使用异步编程
- 在执行较为耗时的操做时,很容易出现用户界面卡顿现 ,用户会觉得应用程序崩溃,从而将
应用程序强制结束。这样作会致使两个结果:一是应用程序但愿完成的操做没法顺利进行;
二是可能会形成数据的丢失。因此在执行耗时操做时应当选择异步编程,将耗时操做的代码
放到另外一个线程上执行,这样不会阻塞用户界面线程的继续执行,用户界面也不会卡顿,极大地
提高用户界面的响应速度,使用户体验度更好。
异步编程方案
- 使用Thread类进行异步编程
- 使用Task对象启动异步操做
- 异步等待语法(async/await)
关于异步为何会跑在原始线程上?我的看法,有错误的话请园友们指出
await操做并无开启新线程,只有遇到到Async方法才会开启,并把主线程返回给线程池中例如client.GetAsync()这类方法,
当await操做等待GetAsync()完成后,会从线程池中随机调出一个空闲线程继续执行,这个线程有多是
GetAsync()执行完后释放掉的,也有多是以前的主线程或其余线程,因此输出的线程ID才有可能全是主线程的ID。编程
- 异步方法主要就是不让线程池里的线程闲着没事干,充分利用
async/await的介绍在下一篇博客异步编程系列(二)多线程