async 和await 关键字适用于什么?

2 c# asynchronous async-await

我完全糊涂了。

它在这里说:

异步方法可以具有以下返回类型:

  • 问题1Task如果并且Task<Result>符合“GetAwaiter”标准,为什么要写任务呢?

  • 问题2在这里我得到的答案IAsyncEnumerable<T>是重点更多的是await。那么其他一切又如何呢?有人可以在没有大例子的情况下清楚地解释每个关键字的适用范围吗?

    哪些类型可以返回异步方法 - 列表或条件?wait 关键字或其条件可以应用于哪些类型

我想要的答案示例:


适用于返回值的关键字async(异步方法可以返回值):type1、type2、typeN 或任何具有特定特征的类型(例如...某些特征)。

关键字await适用于可等待类型:type1、type2、typeN或具有特定特征的类型(例如 contains GetAwaiter)。


  • 问题3.说到 void,我们仅指异步方法的返回值。void 可以是等待类型吗?有人可以举一个空等待的例子吗?

Jon*_*asH 5

如果 Task 和 Task 符合“GetAwaiter”标准,为什么还要写任务呢?

可能是因为Task/Task<Result>90% 左右的情况都会使用。它提示新开发人员只使用这些类型,而不是尝试为此实现自定义类型,或者花费额外的时间查找文档。

问题2.这里得到的答案是IAsyncEnumerable点更多的是await。那么其他一切又如何呢?有人可以在没有十个故事的例子的情况下清楚地解释每个关键字的适用范围吗?

async用于告诉编译器将方法重写为状态机,以便方法的不同部分可以在不同时间运行。如果该方法返回任何内容,则需要将其包装在允许调用者在实际生成结果时使用结果的内容中。

wait用于异步方法,挂起该方法的执行,直到等待的值可用。即它标记编译器将方法分割成不同部分的位置。

我认为你让这件事变得更加复杂:

  • Task当不需要返回值时使用
  • Task<Result>返回值时使用
  • IAsyncEnumerable<T>在异步生成值序列时使用。即每个值都是由单独的网络/数据库调用生成的。与Task<T[]>一次 IO 调用生成一系列值时进行对比。
  • 当您想要最大限度地减少开销时,请使用 ValueTask。请参阅了解 ValueTask 的原因、内容和时间
  • 当你被迫时使用 void。即 UI 事件处理程序。
  • 当您有特殊原因时,请使用自定义类型。这种情况应该很少见,我预计 99% 的开发人员永远不会编写任何此类实现。

说到 void 我们指的是异步方法的返回值,void 不是预期的类型吗?

普通的非 async void 方法实际上可以产生两个结果:

  1. 没有什么
  2. 一个例外

并且只有在方法结束时才会产生结果。等待返回任务的方法会复制此行为。然而 async void 方法则不然。由于没有什么可等待的,调用者无法知道该方法何时以及是否到达结束。并且异常可能会丢失,而没有人知道它的发生。这对于 UI 事件之类的事情是可以接受的,毕竟,为什么 UI 系统并不真正关心按下按钮时会发生什么,而是由开发人员来做处理异常之类的事情。但在大多数其他情况下,Task应使用 来表示同步 void 方法。