gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 18:05:11 25 4
gpt4 key购买 nike

我完全困惑了。

上面写着here :

Async methods can have the following return types:

  • 问题 1。为什么要写任务如果 TaskTask<Result>符合“GetAwaiter”标准吗?

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

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

我想要的答案示例:


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

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


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

最佳答案

Why write about tasks if Task and Task fit the "GetAwaiter" criterion?

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

Question 2. Here I got the answer that the IAsyncEnumerable point is more about await. Then what about everything else? Can someone clearly explain what each keyword applies to without ten-story examples?

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

await 用于异步方法,暂停该方法的执行,直到等待的值可用。 IE。它标记编译器将方法拆分为不同部分的位置。

我认为你让事情变得比实际需要的更复杂:

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

Speaking of void we mean only the return value of the async method, is void not the expected type?

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

  1. 没什么
  2. 异常(exception)

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

关于c# - async 和await 关键字适用于什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73441266/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com