Task.Delay方法在成立时间推移之后才会做到的行事,  Task.Delay方法在确立即间推迟之后才会已毕的办事

  • 线程:
    各样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进度中的独立执行单元,每一种线程都有1个主线程(在实践进入点时确立)并且各个线程还可以以程序方法建立新的线程。
    线程的分红与开行须求一定的时刻与开销开支,所以那几个进度并不是实时的。

  • Task类:
    与Thread相比较,Task是更抽象的定义,MSDN表明就概括一句:“表示异步操作”,即为能以八线程执行的异步操作,从net
    framework4.5开头,要树立落到实处Task后台线程最简易的法子就是应用静态方法Task.Run(),在.Net
    Framework 4.0可以调用Task.Factory.StartNew方法,可以兑现均等的意义

           
持续工作会告诉Task在形成后继续执行后续的作业,持续工作一般由3个回调方法来达成,它会在任务到位后实施四遍。将一个Task加上频频工作有二种艺术,

           
持续工作会告诉Task在形成后继续执行后续的学业,持续工作一般由壹个回调方法来促成,它会在任务到位后实施一遍。将2个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方法会重返2个awaiter(等待者)对象,它会让以前的Task在落成或出错之后执行2个委派,如若原先的Task出现错误,那么当接续工作调用awaited.GetResult()时就会弹出分歧。使用GetResult的功利是,超过前的Task出错时,例外可以平素弹出,而不会封装在
aggregateException中。

   
调用Task.GetAwaiter方法会重返一个awaiter(等待者)对象,它会让原先的Task在形成或出错之后执行3个委派,如若原先的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维护1个线程池,当iis接受到二个伸手时,就会从线程池读取1个线程处理的呼吁,如若采纳同步处理程序格局处理此恳请,此线程直到程序处理完结以前,都会一贯为投机请求服务,并且此线程不能再为其他请求举办劳动,就是所谓的束缚。
    如果线程池够大,就没怎么难点,然则线程池的数目是有限的,当有恢宏从天而降请求,或可应伸手线程都没空后端高延迟性互连网义务时,全体线程池的线程都被封锁,那种意况称为线程耗尽。爆发线程耗尽,IIS会开头将呼吁排入队列,若是队列已满时,IIS就会拒绝请求,并显示http503景况,假使异步应用程序常常,不过有时会发生http503情景,那么可以开拍,事故为县城靠近的情事,可以试着调高队列长度,例如调高至1000。
  • 三八线程与异步
    Task->新线程->读取互联网财富
    二十四线程只是换一条线程来顶替原本会被锁定的主线程,也等于用线程能源(CPU与内存)换可响应的接口。如若换到异步呢?
    异步->线程池->读取互联网财富
    在线程池中时行使DMA(Direct Memory
    Access,直接内存访问)情势,直接内存访问是一种不经过CPU而一贯进行内存数据读取的编制。CLTiggo提供的异步程序模型就是让开发者丰裕利用DMA作用来下降CPU压力

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

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

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