同行使用Await和Async的含义是什么?

3

我了解异步工作原理以及它与JavaScript Promise的比较,但是我不确定像下面这样的一行代码有什么好处。

IdentityResult result = await UserManager.CreateAsync(user, model.password);

由于我们正在创建一个异步调用并立即等待线程,因此在异步调用完成之前,随后的行不会被执行。


这取决于操作的实现方式,但如果实现正确,它将在某个时刻释放等待异步操作(例如IO或网络访问)完成的线程。 - MarcinJuraszek
1
“立即等待线程” - await 不会让 线程 等待,它只会让方法的其余部分等待。这就是整个意图! - Ant P
2个回答

5

好处是,如果该操作确实是异步的,那么在某个时刻,调用线程将被释放以执行应用程序中的其他工作,而不是同步阻塞。

这种使用方式带来了更高的可扩展性。

在继续之前,您仍然需要等待操作完成。异步方法并不能神奇地运行得更快,但它们确实可能使用更少的资源,并且通常可以同时运行多个异步方法。

如果我们想象 CreateAsync 是这样的:

async Task<IdentityResult> CreateAsync()
{
    // do something
    await Task.Delay(1000);
    // do something else
}

然后在 await Task.Delay(1000) 这里,你会释放一个线程并进行异步等待,而不是占用它一秒钟。该线程可以在您的进程中执行其他 CPU 操作,避免上下文切换。

如果 CreateAsync 实现正确,则会有一些实际的异步操作,而不是使用 Task.Delay


1
假设您有一个用户界面,每当按下按钮时就会调用函数UserManager.CreateAsync。
我不知道CreateAsync函数的具体内容,但由于它是异步和可等待的,我猜设计者认为它需要足够长的时间才能异步执行。
如果CreateAsync需要一分钟而且不能被等待,那么您的用户界面将会停滞一分钟。
使用此方法,您的界面仍然可以响应。如果在CreateAsync中将CancellationToken作为参数使用,用户界面甚至可以决定取消任务,例如关闭程序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接