.NET进阶篇06-async异步、thread多线程1

知识须要不断积累、总结和沉淀,思考和写做是成长的催化剂web

异步多线程挺大一块内容,既想拆开慢慢学,又想一股脑全倒出。纠结再三,仍是拆开吃透,也不至于篇幅过长,劝退许多人编程

本篇先作一个概述,列明一些基本概念安全

整个章节分布,能够移步.NET进阶篇-丑话先说,Flag先立bash

内容目录

1、进程和线程一、进程二、线程多线程后台线程三、简言之四、适用场景2、同步和异步一、同步二、异步三、异步编程四、Async、Await五、异步操做优缺点3、小结服务器

1、进程和线程

一、进程

咱们打开计算机的任务管理器,会发现系统的不少个进程,每一个进程独占CPU、内存、磁盘、网络等资源,是资源分配的最小单元。多个进程之间是资源隔离的,数据之间不能直接传递。一个exe运行一次就会产生一个进程,运行屡次就多个,但他们之间数据互相隔离网络

二、线程

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

多线程

衡量一我的干活快,要么是一件事干的很快,要么是他能同时干不少事。计算机就是如此,以单核CPU类比单我的,理论上单位时间上只能运行一个进程里一个线程,只能干一件事。但线程有可能在某些操做好比读写磁盘时会等待,这时候磁盘在疯狂的运转,CPU倒是闲置状态,直到磁盘读写完成才CPU才继续工做,因此空闲的这个时候它能够先去干别的事情,看起来就像单核它也能够同时干不少事异步

一我的能够把水壶烧上水的同时去拖地,同一时刻一我的是只能干一件事的,只是在快速的频繁切换,拖地时一直想着水开了没开了没,但若是处理不当,多线程效率还低,就像你没来及去倒已经烧开的水致使干锅,还有些任务同时起来更费时,就像你一边拖地一遍广播体操同样,伸展运动123而后拖一下地,而后接着,唉?到哪里了…async

后台线程

后台线程不会阻止进程的关闭。当某个程序的全部前台线程完成后,进程就终止程序退出了,固然后台线程也会随即中止。在.NET中用Thread建立的线程默认都是前台线程,用线程池、BeginXXX等启用的线程都是后台线程异步编程

三、简言之

线程是独立执行单元,同一段代码(参数不一样,任务不一样)能够交给多个线程去执行,从宏观上看就是并行的执行,微观上时间片上仍是串行执行的。但多核CPU就另说了,像多我的同样,一我的负责作饭,一个负责拖地

多线能够提升CPU的利用率,一个线程等待时,能够先去执行其余的任务,固然,线程之间的切换也是须要消耗资源的,开发复杂度也是会变大的,资源争夺也须要作合理的控制,也并非全部的任务都适合多线程

四、适用场景

后台执行耗时任务,前台界面仍须要友好的展现。在WinForm中,若是单线程(也就是主线程)若是执行耗时的操做,那么界面就会失去响应,它忙于后台的任务,没法更新用户界面的交互。这个时候能够另开一个工做线程来处理耗时的任务,主线程能够响应用户操做,也能够随时改变任务的状态

在没有界面的程序里,当一个任务有潜在的耗时时,好比等待远程服务器的响应返回,用工做线程来完成任务可让主线程去作其余事情

复杂的计算,多线程在多核CPU上能够更快的完成任务。总之一切都是为了效率,.NET中不少暗中的多线程,好比timer,backgroudworker,webservices等,咱们使用中天然而然就在利用其多线程带来的好处,在了解了基本原理后,咱们须要手动建立管理明面上的多线程任务

多线程纵然能够提升你的程序流畅度,但开发调试中确实增大了难度,一方面除了要对业务划分适应多线程的处理模式,另外一个方面多线程最终仍是交于操做系统的调度,咱们虽能够执行一些优化调度,但最终结果并非总尽人意,线程之间的切换也会消耗资源,因此多线程的设计应该尽可能简单

2、同步和异步

一、同步

同步方法调用在程序继续执行以前须要等待同步方法执行完毕返回结果,程序自上而下顺序执行,没完成一个指令,在进行下一个指令。在代码调试的表现为,光标一步一步完成上一步计算后,才会进入下一行。阻塞调用线程的运行

二、异步

异步方法则在被调用以后,调用线程不会等待方法的完成,会直接进入下一行,执行下一个指令,因此是非阻塞

三、异步编程

.NET经过委托能够实现异步调用任何方法。像上面介绍委托方法调用时,除了Invoke同步方法,还有BegInvoke异步方法,它会启用一个异步调用线程,你只须要传入委托方法的参数(可能还须要线程额外参数,若是有必要的话)就能够之后台线程的方式执行方法。在代码上执行到BeginInvoke时,会当即返回,不等待异步调用的完成,它返回一个IAsyncResult类型,你能够用它来监视调用的进度。和BegInvoke成对的EndInvoke方法能够用于获取异步调用的结果,这是会阻塞的。具体将在下一篇代码实例中讲解BeginInvoke的经常使用套路

四、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
} 
复制代码

五、异步操做优缺点

异步操做相比较于多线程,减小了死锁的可能,在设计良好的状况下,异步函数能够没必要使用共享变量,能够减小出错的概率。但起步也是难以调试的,只有尽可能减小其复杂度

3、小结

这篇主要介绍一些概念,接下来硬核编码部分就不会再啰嗦这些,上面有遗漏的,在编码中会捎带一些。基本就这些吧,TaskFactory、ThreadPool、Task、Parallel等都是对Thread的封装,过一遍代码,了解经常使用方法套路就能够。不会面面俱到每一个接口都试一下,微软官网文档更全面(吹一波,.NET微软大佬的技术支持仍是杠杠的)。后面主要搞一些成熟的套路,好比线程的同步,线程取消,异常处理,线程安全、锁机制等可用的编码方式。

OK,那下期见,去给FPX打气去,拜了个拜~



兽人永不为奴

相关文章
相关标签/搜索