异步编程模式
.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.Task
和System.Threading.Tasks.Task<TRresult>
类型,这些类型用于表示任意的异步操作。
-
TAP 中的异步方法在操作名称后包含 Async 后缀;例如,get 操作的 GetAsync。 如果你正在将 TAP 方法添加到已包含具有 Async 后缀的方法名称的类中,请改用后缀 TaskAsync。 例如,如果类具有 GetAsync 方法,请使用名称 GetTaskAsync。
-
TAP 方法返回
System.Threading.Tasks.Task
或System.Threading.Tasks.Task<TResult>
,取决于相应的同步方法是返回 void 还是类型 TResult。 -
TAP方法的参数不能是out与ref的。应将通过out或ref参数返回的所有数据改为作为Task
返回的TRsult的一部分返回,且应使用元组或自定义数据结构来容纳多个值。
在某些情况下,完成操作所需要的工作量要比异步启动操作所需的工作量少。读取流时,按照在内存中已缓冲好的数据来满足读取,这类情形下操作可能会同步完成,同时返回已完成的任务。
-
TAP中,取消是异步方法实现者和异步方法使用者的选项。如果操作允许取消,则会公开接受取消标记(CancellationToken 实例)的异步方法的重载。 按照约定,该参数命名为 cancellationToken。该异步操作监视取消请求的此标记。如果它收到取消请求,则可以选择接受该请求并取消操作。如果取消请求到时过早的结束工作,则TAP方法返回一个Canceled状态下结束的任务,没有可用结果且不引发异常。Canceled状态被视为任务最终(完成)状态。因此,如果一个任务处于 Canceled 状态,则其 IsCompleted 属性将返回 true。
-
某些异步操作可能需要进度通知。与取消一下,仅在API支持进度同时,TAP实现才应提供IProcess
参数。如果TAP实现提供接受process参数的重载,则必须允许该参数为null,在这种情况下,不会报告任何进度。
实现基于任务的异步模式
- 生成TAP方法
- 使用编译器 在.NET Framework4.5中,任何具有async关键字的放安抚都被看做是一种异步方法,并且C#编译器会执行必要的转换,以通过TAP来异步实现该方法
- 手动生成TAP方法
- 混合方法
在计算密集型任务中,如果系统在开始运行任务之前收到取消请求,则它可以防止执行已计划的任务。同样,如果你提供一个取消标记(CancellationToken对象),则可以将标记传递给监视该标记的异步代码
使用基于任务的异步模式
当在等待Task时,await表达式的类型为void,等待Task