异步程序知识点梳理

  • 线程:
    每一种Windows进度都有用于进入程序的进入点(entry point)的主线程(Main
    Thread),例如.Net
    framework执行顺序(控制台、Windows
    WPF等应用程序)使用Main()方法作为程序的进入点,调用该措施时会自动建立主线程。
    线程是Windows进程中的独立执行单元,种种线程都有贰个主线程(在推行进入点时创立)并且每一种线程仍是能够以程序方法确立新的线程。
    线程的分配与开发银行须求肯定的岁月与资金费用,所以这一个历程并不是实时的。

  • Task类:
    与Thread相比较,Task是更抽象的定义,MSDN表明就大约一句:“表示异步操作”,即为能以十二线程执行的异步操作,从net
    framework4.5从头,要确立落实Task后台线程最简单易行的艺术正是利用静态方法Task.Run(),在.Net
    Framework 4.0方可调用Task.Factory.StartNew方法,能够达成平等的效率

  • 线程:
    每种Windows进程都有用于进入程序的进入点(entry point)的主线程(Main
    Thread),例如.Net
    framework执行顺序(控制台、Windows
    WPF等应用程序)使用Main()方法作为程序的进入点,调用该措施时会自动建立主线程。
    线程是Windows进程中的独立执行单元,各种线程都有四个主线程(在推行进入点时创设)并且每一种线程仍是可以以程序方法确立新的线程。
    线程的分配与开发银行必要肯定的时日与资金耗费,所以那些进程并不是实时的。

  • Task类:
    与Thread比较,Task是更抽象的定义,MSDN表达就大致一句:“表示异步操作”,即为能以多线程执行的异步操作,从net
    framework4.5始发,要白手起家落实Task后台线程最简单易行的法子正是采取静态方法Task.Run(),在.Net
    Framework 4.0能够调用Task.Factory.StartNew方法,能够达成均等的成效

           
持续工作会告诉Task在做到后继续执行后续的功课,持续工作一般由一个回调方法来兑现,它会在义务实现后进行一遍。将3个Task加上频频工作有二种办法,

           
持续工作会告诉Task在做到后继续执行后续的作业,持续工作一般由1个回调方法来达成,它会在职分达成后进行三遍。将3个Task加上频频工作有两种艺术,

    1. 率先种是调用Task.ContinueWith方法
    2. 其次种是.Net
      Framework4.5骤增的Awaiter方法,它分外重庆大学,因为C#5.0的异步作用就是应用那种艺术。先看程序代码来验证
    1. 首先种是调用Task.ContinueWith方法
    2. 第三种是.Net
      Framework4.5增加产量的Awaiter方法,它不行主要,因为C#5.0的异步成效正是行使那种方式。先看程序代码来申明

    Task<int> task=Task.Run(
         ()=>Enumerable.Range(1,5000000).Count(n=>(n%3)==0);
         var awaiter=task.GetAwaiter();
         awaiter.OnCompleted(()=>
       {
         int result=awaiter.GetResult();
         Console.WriteLine("整除3的个数有:"+Result);
         Console.WriteLine("Task执行中...")
         Console.ReadLine();
       });
    Task<int> task=Task.Run(
         ()=>Enumerable.Range(1,5000000).Count(n=>(n%3)==0);
         var awaiter=task.GetAwaiter();
         awaiter.OnCompleted(()=>
       {
         int result=awaiter.GetResult();
         Console.WriteLine("整除3的个数有:"+Result);
         Console.WriteLine("Task执行中...")
         Console.ReadLine();
       });

   
调用Task.GetAwaiter方法会再次回到3个awaiter(等待者)对象,它会让在此以前的Task在成功或出错之后执行二个委派,如若原先的Task出现错误,那么当接续工作调用awaited.GetResult()时就会弹出不相同。使用GetResult的好处是,超越前的Task出错开上下班时间,例外能够平素弹出,而不会封装在
aggregateException中。

   
调用Task.GetAwaiter方法会重临一个awaiter(等待者)对象,它会让原先的Task在形成或出错之后执行二个委派,尽管原先的Task出现谬误,那么当接续工作调用awaited.GetResult()时就会弹出分化。使用GetResult的功利是,超过前的Task出错开上下班时间,例外能够一贯弹出,而不会封装在
aggregateException中。

       
  Task.Delay方法在成马上间推移之后才会做到的行事,不难地说,它就是Thread.Sleep的异步版本

       
  Task.Delay方法在成立即间推移之后才会做到的行事,容易地说,它正是Thread.Sleep的异步版本

           Parallel类
主要提供互相循环和区域的支撑,首要有七个章程For、Foreach、Invoke,主要说一下Invoke方法,Invoke方法会简化运转一组并行操作,它接受一组Action[]数组。

           Parallel类
主要提供互相循环和区域的支撑,首要有五个点子For、Foreach、Invoke,主要说一下Invoke方法,Invoke方法会简化运营一组并行操作,它承受一组Action[]数组。

  • Async与await关键词
    有async修饰词不自然有await运算符,但有await运算符一定有async修饰词,依照微软的提出,开发人员本人编辑的异步方法最佳也使用“Async”结尾。
  • 异步与线程池
    当在应用程序中山高校量采纳二十四线程技术时,首先有少数务必注意。.net
    framework
    会在IIS维护四个线程池,当iis接受到三个请求时,就会从线程池读取贰个线程处理的呼吁,如若运用同步处理程序格局处理此呼吁,此线程直到程序处理完结此前,都会直接为和谐请求服务,并且此线程不可能再为别的请求进行服务,正是所谓的羁绊。
    假如线程池够大,就没怎么难题,可是线程池的数量是容易的,当有多量突发请求,或可应伸手线程都忙不迭后端高延迟性互联网职务时,全数线程池的线程都被束缚,那种气象称为线程耗尽。发生线程耗尽,IIS会初叶将请求排入队列,倘诺队列已满时,IIS就会拒绝请求,并显现http503状态,若是异步应用程序符合规律,不过有时会发生http503场合,那么能够开拍,事故为县城靠近的景况,能够试着调高队列长度,例如调高至一千。
  • 二十四线程与异步
    Task->新线程->读取网络能源
    二十多线程只是换一条线程来代替原本会被锁定的主线程,也正是用线程财富(CPU与内部存款和储蓄器)换可响应的接口。若是换到异步呢?
    异步->线程池->读取网络财富
    在线程池中时使用DMA(Direct Memory
    Access,直接内部存款和储蓄器访问)方式,直接内部存款和储蓄器访问是一种不经过CPU而从来开始展览内部存储器数据读取的编写制定。CL奇骏提供的异步程序模型就是让开发者足够利用DMA成效来下滑CPU压力
  • Async与await关键词
    有async修饰词不必然有await运算符,但有await运算符一定有async修饰词,遵照微软的提出,开发职员本身编写的异步方法最佳也接纳“Async”结尾。
  • 异步与线程池
    当在应用程序中山大学量使用多线程技术时,首先有少数必须小心。.net
    framework
    会在IIS维护一个线程池,当iis接受到多个伸手时,就会从线程池读取二个线程处理的呼吁,假如选拔同步处理程序方式处理此恳请,此线程直到程序处理实现以前,都会一贯为协调请求服务,并且此线程不能再为别的请求举行劳动,正是所谓的束缚。
    假如线程池够大,就没怎么难题,然而线程池的数码是有限的,当有大气发生请求,或可应伸手线程都没空后端高延迟性互连网任务时,全体线程池的线程都被封锁,那种景观称为线程耗尽。产生线程耗尽,IIS会伊始将请求排入队列,即便队列已满时,IIS就会拒绝请求,并显示http503地方,如若异步应用程序符合规律,不过有时会发生http503动静,那么能够开拍,事故为县城靠近的动静,可以试着调高队列长度,例如调高至一千。
  • 多线程与异步
    Task->新线程->读取互连网财富
    八线程只是换一条线程来取代原本会被锁定的主线程,也便是用线程能源(CPU与内部存款和储蓄器)换可响应的接口。借使换到异步呢?
    异步->线程池->读取互连网能源
    在线程池中时行使DMA(Direct Memory
    Access,直接内部存款和储蓄器访问)形式,直接内部存款和储蓄器访问是一种不通过CPU而一直进行内部存款和储蓄器数据读取的建制。CLOdyssey提供的异步程序模型就是让开发者丰盛利用DMA成效来下降CPU压力

     所以结论是:
       -CPU Bound:适合采用多线程;
       -IO  Bound:适合采用异步;
     所以结论是:
       -CPU Bound:适合采用多线程;
       -IO  Bound:适合采用异步;

下一步是时候看看 .Net Core了。

下一步是时候看看 .Net Core了。