C++.Net-C#异步程序知识点梳理

  • 线程:
    每个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在形成后继续执行后续的功课,持续工作一般由一个回调方法来促成,它会在义务已毕后举办两回。将一个Task加上频频工作有三种艺术,

    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.GetAwaiter方法会再次来到一个awaiter(等待者)对象,它会让原先的Task在做到或出错之后执行一个委派,即使原先的Task现身错误,那么当接续工作调用awaited.GetResult()时就会弹出差异。使用GetResult的补益是,当先前的Task出错时,例外可以一直弹出,而不会封装在
aggregateException中。

       
  Task.Delay方法在确立刻间推移之后才会完成的工作,简单地说,它就是Thread.Sleep的异步版本

           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而平素举办内存数据读取的建制。CLR提供的异步程序模型就是让开发者丰裕利用DMA作用来下滑CPU压力

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

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