正在使用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
在这里有什么意义呢?
优点是将控件返回给当前方法的调用方。当等待的任务完成时,异步方法将"恢复"。
这非常有用,因为它消除了管理线程和/或回调的需要。
编辑:
以下是您希望(或不希望)使用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。