我理解异步如何工作以及它与javascript承诺的比较,但我不确定如下所示的行如何可以带来任何好处
IdentityResult result = await UserManager.CreateAsync(user, model.password);
因为我们正在创建一个异步调用并立即在线程上等待,所以后面的行不会被执行,直到异步调用调用完成。
答案 0 :(得分:5)
好处是如果该操作是真正异步的,那么在某些时候调用线程将被释放以在应用程序中执行其他工作,而不是同步阻塞。
这种用法带来了更高的可扩展性。
您还在等待操作完成后再继续操作。异步方法不会神奇地运行得更快,但它们可能会使用更少的资源,您通常可以同时运行多个资源。
如果我们想象CreateAsync
看起来像这样:
async Task<IdentityResult> CreateAsync()
{
// do something
await Task.Delay(1000);
// do something else
}
然后在await Task.Delay(1000)
你释放一个线程并异步等待而不是等待它一秒钟。该线程可以在您的进程中执行其他CPU操作,并避免上下文切换。
如果CreateAsync
正确实施,则会有一些实际的异步操作,而不是Task.Delay
答案 1 :(得分:1)
假设您有一个用户界面,只要按下按钮,就会调用您的函数UserManager.CreateAsync。
我不知道CreateAsync函数,但由于它是异步和等待的,我猜设计师认为它需要很长时间才能执行异步。
如果CreateAsync需要一分钟而且不会等待,那么您的用户界面将会死一分钟。
使用此方法,您的界面仍然会响应。如果您在CreateAsync中使用CancellationToken作为参数,则用户界面甚至可以决定取消该任务,例如关闭该程序。