正在使用await关键字

本文关键字:await 关键字 | 更新日期: 2023-09-27 18:24:15

我创建了一个新的ASP.Net 5应用程序,在生成的代码中大量使用了await关键字,例如:

var result = await _userManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
    await _signInManager.SignInAsync(user, isPersistent: false);
    return RedirectToAction(nameof(HomeController.Index), "Home");
}

我的问题是,我们通过这件事能完成什么?我们仍然需要等待结果,直到我们没有得到结果,我们才能继续前进。那么await在这里有什么意义呢?

正在使用await关键字

优点是将控件返回给当前方法的调用方。当等待的任务完成时,异步方法将"恢复"。

这非常有用,因为它消除了管理线程和/或回调的需要。

编辑:

以下是您希望(或不希望)使用async/await的原因。假设你有这样的网络呼叫:

public RequestResult Request(string queryString)
{
    var response = connection.Request(queryString);
}

这是一个阻塞调用,它将停止当前执行的线程并等待调用完成。可能存在Request(string)方法的Async版本,通常以Async作为后缀。如果是,则可以使用async Task方法对其进行await

public RequestResult Request(string queryString)
{
    var response = connection.Request(queryString);
}

控件将被释放,直到任务完成,从而允许调用方继续。这对于GUI应用程序非常有用。您可以将async方法绑定到事件,激发它,启动请求,并在请求完成时保持UI更新。

async/await之前,首选的方法是使用Begin/End方法。将一个委托传递给Begin方法,该方法将在任务完成时被调用。我想指出的是,这个还是可以用的!以下是关于异步模式的更多详细信息。async/await被称为TAP,基于任务的异步编程。

编辑:C#编译器将在await关键字之后获取该方法的其余部分,并使其成为某种回调(内部)。

据推测,这一切都发生在具有async关键字的函数内部。考虑函数的调用方-他们await正在执行某些操作(此函数!),并且他们很可能在此期间继续执行其他操作。

在ASP.NET的上下文中,应用程序通过某些方式捕获传入请求,并调用控制器上的方法来计算作为响应发送的内容。如果您的控制器操作是async,则您的应用程序可以执行多任务(双关语…)并更快地提供更多请求,而无需等待例如数据库或I/O。