当前位置: 首页 > 知识库问答 >
问题:

我对Async/Await的理解、它的工作方式和它的好处是否正确?

颛孙星海
2023-03-14

Async/Await并不意味着任何类型的并发。使用async/await编写的应用程序可以完全是单线程的,同时仍然可以获得所有的好处,这与Node.js(尽管有回调)的做法很相似。与Node.js不同,.NET是多线程的,因此通过具有async/await,您可以在不使用回调的情况下获得非阻塞IO的好处,同时还具有多个执行线程。

Async/Await在等待IO完成时释放线程来执行其他操作。它还可以与TPL一起使用,在多个线程上执行CPU绑定的工作,或者在UI线程之外执行CPU绑定的工作。

为了从非阻塞IO中获益,异步html" target="_blank">方法需要构建在API之上,这些API实际上利用了最终由OS提供的非阻塞IO。

这是我理解中最大的争论点。很多人认为,将阻塞操作包装在task中并使用async/await将带来性能的提高。通过创建一个额外的线程来处理一个操作,将原来的线程返回到线程池,然后在任务完成后恢复原来的方法,所发生的只是不必要的上下文切换,而并没有真正释放线程来做其他工作。虽然这并不是对Async/Await的误用,而是对TPL的误用,但这种心态似乎源于对Async/Await的误解。

共有1个答案

王叶五
2023-03-14

这是非常正确的。

但有几个注意事项:

  • 开始执行异步方法的线程是调用方的线程,它可能是ThreadPool线程,也可能不是。
  • 如果到达await,但awaitable(通常为任务)已经完成,则线程将继续同步执行方法的其余部分。
  • 恢复运行方法的线程通常是ThreadPool线程,但这取决于SyncrhonizationContextTaskScheduler
  • 这里不涉及JIT(不比通常更多)。编译器是将异步方法转换为状态机的编译器。您可以通过这个TryRoslyn示例看到这一点。
  • 确实,async-await不一定意味着并发,因为它可以是单线程的。但是,通过同时启动和等待多个异步操作,即使只有一个线程,它仍然可以是并发的。
  • 异步等待和TPL不是完全分开的部分。async-await构建在TPL之上。这就是它被称为基于任务的异步模式的原因。
  • 虽然大多数真正的异步操作都是I/O,但并非所有操作都是。您还通常使用task.delay异步延迟,或者使用异步同步构造,如semaphoreslim.waitasync.
 类似资料:
  • 本文向大家介绍你是如何更好地处理Async/Await的异常的?相关面试题,主要包含被问及你是如何更好地处理Async/Await的异常的?时的应答技巧和注意事项,需要的朋友参考一下 @HCLQ 玩node时。。他那么写还是比较常见的。。 你是指 callback 中使用的 error-first 的错误处理方式吗? 这种的确是常见,但是返回 的 我真的没见过。或许可以给些例子?

  • 本文向大家介绍说说你对async/await的理解?相关面试题,主要包含被问及说说你对async/await的理解?时的应答技巧和注意事项,需要的朋友参考一下 对generator生成器函数的改造,* 用async代替,yeild用await代替,使其更语义化,并且自动执行next方法 结合promise,采用同步代码的形式写异步代码,更优雅地解决回调地狱问题

  • 我搜索过,似乎这被称为列表理解,但它是如何工作的?

  • 我正在阅读Kafka的文件,并试图理解它的工作。这是关于消费者的。简而言之,一个主题被划分成若干个分区。有多个消费者组,每个消费者组有多个消费者实例。现在,我的问题是,是否每个分区发送“相同”的消息给每个消费者组,这些消息又被赋予组内的特定消费者实例? 如果我错过了什么,请给我指引。

  • 在Node.jsV8.9中,我有以下函数来处理用户注册: 正如您所看到的,我正在使用异步,并等待在用户未成功创建时进行处理。但是,当创建失败时,我的catch()从不执行。为什么?使用Async/Await是否有不同的方法来处理承诺拒绝?有人建议使用thow new Error(),但我不想抛出一个错误,我只想向客户机发回一个消息。 更多背景信息:应用程序是用Express.js制作的,并使用Se