Await和Async在同一行

时间:2015-07-26 18:18:47

标签: c# async-await

我理解异步如何工作以及它与javascript承诺的比较,但我不确定如下所示的行如何可以带来任何好处

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

因为我们正在创建一个异步调用并立即在线程上等待,所以后面的行不会被执行,直到异步调用调用完成。

2 个答案:

答案 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作为参数,则用户界面甚至可以决定取消该任务,例如关闭该程序。