基于任务的异步模式
1、 I/O绑定与CPU绑定
I/O绑定:代码“等待”某些内容,例如:数据库中的数据,就是I/O绑定;async中返回一个Task或者Task<T>。
CPU绑定:代码执行开销巨大的计算,就是CPU绑定;等待使用Task.Run在后台启动的操作。
2、 异步模型核心
异步模型的核心是Task和Task<T>,他们受async和await的操作。异步方法旨在成为非阻止的操作,它不会阻塞当前线程。
3、 关于异步方法参数
异步方法无法声明in、ref或 out参数,但可以调用包含此类参数的方法。 同样,异步方法无法通过引用返回值,但可以调用包含 ref 返回值的方法。
4、异步方法的返回类型
- Task(对于执行操作但不返回任何值的异步方法)。
- Task<TResult>(对于返回值的异步方法)。
- void(对于事件处理程序)。
- 从 C# 7.0 开始,任何具有可访问的 GetAwaiter 方法的类型。 GetAwaiter 方法返回的对象必须实现 System.Runtime.CompilerServices.ICriticalNotifyCompletion 接口。从 C# 8.0 开始,IAsyncEnumerable<T> 返回异步流的异步方法 。
返回 void 的异步方法的调用方无法捕获从该方法引发的异常,且此类未经处理的异常可能会导致应用程序故障。 如果返回 Task 或 Task<TResult> 的方法引发异常,则该异常存储在返回的任务中。 等待任务时,将重新引发异常。
5、取消任务
已经开始执行的任务无法取消, 但是可以通过判断cancelSource.Token.IsCancellationRequested来控制代码是否结束
用于实现协作取消模型的常规模式是:
- 实例化 CancellationTokenSource 对象,此对象管理取消通知并将其发送给单个取消标记。
- 将 CancellationTokenSource.Token 属性返回的标记传递给每个侦听取消的任务或线程。
- CancellationToken.IsCancellationRequested从接收取消标记的操作中调用方法。 为每个任务或线程提供响应取消请求的机制。 是否选择取消操作以及具体操作方式取决于应用程序逻辑。
- 调用 CancellationTokenSource.Cancel 方法以提供取消通知。 这会将 CancellationToken.IsCancellationRequested 取消标记的每个副本上的属性设置为 true 。
- Dispose CancellationTokenSource对象 。