我完全糊涂了。
它在这里说:
异步方法可以具有以下返回类型:
Task,对于执行操作但不返回任何值的异步方法。
Task <TResult>,对于返回值的异步方法。
void,对于事件处理程序。从 C# 7.0 开始,任何具有可访问
GetAwaiter方法的类型。方法返回的对象GetAwaiter必须实现该System.Runtime.CompilerServices.ICriticalNotifyCompletion接口。从 C# 8.0 开始,对于返回异步流的
IAsyncEnumerable<T>异步方法。
问题1.Task如果并且Task<Result>符合“GetAwaiter”标准,为什么要写任务呢?
问题2。在这里我得到的答案IAsyncEnumerable<T>是重点更多的是await。那么其他一切又如何呢?有人可以在没有大例子的情况下清楚地解释每个关键字的适用范围吗?
哪些类型可以返回异步方法 - 列表或条件?wait 关键字或其条件可以应用于哪些类型?
我想要的答案示例:
适用于返回值的关键字async(异步方法可以返回值):type1、type2、typeN 或任何具有特定特征的类型(例如...某些特征)。
关键字await适用于可等待类型:type1、type2、typeN或具有特定特征的类型(例如 contains GetAwaiter)。
如果 Task 和 Task 符合“GetAwaiter”标准,为什么还要写任务呢?
可能是因为Task/Task<Result>90% 左右的情况都会使用。它提示新开发人员只使用这些类型,而不是尝试为此实现自定义类型,或者花费额外的时间查找文档。
问题2.这里得到的答案是IAsyncEnumerable点更多的是await。那么其他一切又如何呢?有人可以在没有十个故事的例子的情况下清楚地解释每个关键字的适用范围吗?
async用于告诉编译器将方法重写为状态机,以便方法的不同部分可以在不同时间运行。如果该方法返回任何内容,则需要将其包装在允许调用者在实际生成结果时使用结果的内容中。
wait用于异步方法,挂起该方法的执行,直到等待的值可用。即它标记编译器将方法分割成不同部分的位置。
我认为你让这件事变得更加复杂:
Task当不需要返回值时使用Task<Result>返回值时使用IAsyncEnumerable<T>在异步生成值序列时使用。即每个值都是由单独的网络/数据库调用生成的。与Task<T[]>一次 IO 调用生成一系列值时进行对比。说到 void 我们指的是异步方法的返回值,void 不是预期的类型吗?
普通的非 async void 方法实际上可以产生两个结果:
并且只有在方法结束时才会产生结果。等待返回任务的方法会复制此行为。然而 async void 方法则不然。由于没有什么可等待的,调用者无法知道该方法何时以及是否到达结束。并且异常可能会丢失,而没有人知道它的发生。这对于 UI 事件之类的事情是可以接受的,毕竟,为什么 UI 系统并不真正关心按下按钮时会发生什么,而是由开发人员来做处理异常之类的事情。但在大多数其他情况下,Task应使用 来表示同步 void 方法。
| 归档时间: |
|
| 查看次数: |
185 次 |
| 最近记录: |