在新的 Identity 模板代码中,登录用户的 Controller 代码被包裹在 async
block 中:
private async Task SignInAsync(ApplicationUser user, bool isPersistent)
{
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
AuthenticationManager.SignIn(new AuthenticationProperties()
{ IsPersistent = isPersistent },
await user.GenerateUserIdentityAsync(UserManager));
}
但所有对 SignInAsync 的调用都只是等待
任务完成。那么使登录代码异步的额外开销和复杂性有什么意义呢?还是创建模板的人可能已经设想了某种异步登录场景,这仍然是一个谜?
编辑:好的,我的问题似乎有些困惑。让我们试试这个:
当对函数的所有调用实际上是同步的时,为什么要创建异步 SignInAsync 函数:
await SignInAsync()
如果调用者在 await
ing 之前做了一些其他工作,异步函数就有意义,但事实并非如此......
最佳答案
Why create an asynchronous SignInAsync function when all of the calls to the function are effectively synchronous
你这样说,然后给出一个异步调用的例子。
所以,我认为混淆是关于同步 和顺序 之间的区别。考虑有问题的代码:
await SignInAsync();
这是一个异步调用。它所在的方法将被顺序评估,因为它会立即等待
返回的任务,但这不会使其同步。它仍然是异步的。
您可以将“顺序”视为“一次一步”;这与一次做多件事的“并发”形成对比。 “异步”可以表示“在不阻塞的情况下执行某些操作”,而“同步”表示“在操作期间使用调用线程”。
Async 和 await 启用异步顺序代码(以及异步并发代码,如果您使用类似 Task.WhenAll
的代码)。
关于c# - 为什么 SignInAsync 是异步的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23901598/