C# async/await 如果仍然等待前面的执行完成,有什么好处呢?

Paw*_*iya 8 c# asynchronous async-await

我尝试阅读 stackoverflow 中有关 的实际使用的许多文章和问题async/await,因此基本上是异步方法调用,但不知何故我仍然无法解码它如何提供并行性和非阻塞行为。我参考了一些这样的帖子

几乎所有地方都可以使用 async/await 吗?

https://news.ycombinator.com/item?id=19010989

使用 async 和await 关键字的好处

所以如果我写一段这样的代码

var user = await GetUserFromDBAsync();
var destination = await GetDestinationFromDBAsync();
var address = await GetAddressFromDBAsync();
Run Code Online (Sandbox Code Playgroud)

尽管这三个方法都是异步的,但代码仍然不会转到第二行从数据库获取,直到完全从数据库destination获取。user

那么这里的并行性和非阻塞行为在哪里呢asyn/await?在执行下一行之前,它仍然等待完成第一个操作。

或者我对异步的总体理解是错误的?

编辑

任何例子都会很有帮助!

Sco*_*nen 11

async/await 的重点不在于方法执行得更快。相反,它是关于当这些方法等待来自数据库、文件系统、HTTP 请求或其他 I/O 的响应时线程正在执行的操作。

如果没有异步执行,线程只会等待。从某种意义上说,它是浪费的,因为在那段时间里它什么也没做。我们没有无限的线程供应,因此让线程等待是一种浪费。

Async/await 只是允许线程做其他事情。该线程可以处理其他请求,而不是等待。然后,当数据库查询完成或 HTTP 请求收到响应时,下一个可用线程将开始执行该代码。

所以是的,示例中的各个行仍然按顺序执行。他们只是执行得更有效率。如果您的应用程序收到许多请求,它可以更快地处理这些请求,因为有更多线程可用于工作,而不是阻塞,只是等待某些 I/O 操作的响应。

我强烈推荐这篇博文:没有线索。async/await 是关于在另一个线程上执行某些操作,这有点令人困惑。根本不是这个问题。这是为了确保没有线程在可以执行其他操作时处于等待状态。