异步编程了解

异步编程模式

.NET Framework提供了异步操做的三种模式:编程

  • 异步编程模型(Asynchronous Programming Model,APM)模式(也称IAsyncResult模式),在此模式中异步操做须要Begin与End方。对于新的开发工做不推荐这用模式。
  • 基于事件的异步模式(Event-based Asynchronous Pattern,EAP),这种模式须要Async后缀,也须要一个或多个事件、事件处理程序委托类型和EventArg派生类型 。EAP在.NET Framework2.0中引入的,对于新的开发不在建议使用此模式。
  • 基于任务的异步模式(Task-based Asynchronous Pattern,TAP)使用一个方法来表示异步操做的启动和完成。TAP是在.NET Framework4中引入的,而且它是.NET Framework中进行异步编程推荐使用的方法。C#中使用async与await关键字为TAP添加了语言的支持。数据结构

    基于事件的异步模式(TAP)

    TAP是基于命名空间中的System.Threading.Tasks.Tassk命名空间中的System.Threading.Tasks.TaskSystem.Threading.Tasks.Task<TRresult>类型,这些类型用于表示任意的异步操做。异步

  1. TAP 中的异步方法在操做名称后包含 Async 后缀;例如,get 操做的 GetAsync。 若是你正在将 TAP 方法添加到已包含具备 Async 后缀的方法名称的类中,请改用后缀 TaskAsync。 例如,若是类具备 GetAsync 方法,请使用名称 GetTaskAsync。async

  2. TAP 方法返回System.Threading.Tasks.TaskSystem.Threading.Tasks.Task<TResult>,取决于相应的同步方法是返回 void 仍是类型 TResult。异步编程

  3. TAP方法的参数不能是out与ref的。应将经过out或ref参数返回的全部数据改成做为Task 返回的TRsult的一部分返回,且应使用元组或自定义数据结构来容纳多个值。 code

在某些状况下,完成操做所须要的工做量要比异步启动操做所需的工做量少。读取流时,按照在内存中已缓冲好的数据来知足读取,这类情形下操做可能会同步完成,同时返回已完成的任务。对象

  1. TAP中,取消是异步方法实现者和异步方法使用者的选项。若是操做容许取消,则会公开接受取消标记(CancellationToken 实例)的异步方法的重载。 按照约定,该参数命名为 cancellationToken。该异步操做监视取消请求的此标记。若是它收到取消请求,则能够选择接受该请求并取消操做。若是取消请求到时过早的结束工做,则TAP方法返回一个Canceled状态下结束的任务,没有可用结果且不引起异常。Canceled状态被视为任务最终(完成)状态。所以,若是一个任务处于 Canceled 状态,则其 IsCompleted 属性将返回 true。事件

  2. 某些异步操做可能须要进度通知。与取消一下,仅在API支持进度同时,TAP实现才应提供IProcess 参数。若是TAP实现提供接受 process参数的重载,则必须容许该参数为null,在这种状况下,不会报告任何进度。 内存

实现基于任务的异步模式

  • 生成TAP方法
  1. 使用编译器 在.NET Framework4.5中,任何具备async关键字的放安抚都被看作是一种异步方法,而且C#编译器会执行必要的转换,以经过TAP来异步实现该方法
  2. 手动生成TAP方法
  3. 混合方法

在计算密集型任务中,若是系统在开始运行任务以前收到取消请求,则它能够防止执行已计划的任务。一样,若是你提供一个取消标记(CancellationToken对象),则能够将标记传递给监视该标记的异步代码开发

使用基于任务的异步模式

当在等待Task时,await表达式的类型为void,等待Task 时,await表达式为TResult,await表达式必须出如今异步方法的主体内。等待功能经过持续性在任务上安装回调,此回调将在挂起点继续异步方法,恢复异步方法 在恢复异步方法时,若是等待操做已成功完成而且为 Task ,则将返回其 TResult。若是所等待的 Task 或 Task 以 Canceled 关闭状态结束,则将引起 OperationCanceledException 异常。若是所等待的 Task 或 Task 以 Faulted 状态关闭,则将引起致使其出错的异常。 因为多个异常,Task 可能错误,可是只传播这些异常中的一个。 可是,Task.Exception 属性返回包含全部错误的 AggregateException 异常。

相关文章
相关标签/搜索