异步编程了解

异步编程模式

.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。

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

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

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

  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 异常。

你可能感兴趣的:(编程)