【发布时间】:2020-05-25 13:01:51
【问题描述】:
我在教程中遇到了以下方法;
private async Task<ClaimsIdentity> GetClaimsIdentity(string userName, string password)
{
if (string.IsNullOrEmpty(userName) || string.IsNullOrEmpty(password))
return await Task.FromResult<ClaimsIdentity>(null);
// get the user to verifty
var userToVerify = await _userManager.FindByNameAsync(userName);
if (userToVerify == null) return await Task.FromResult<ClaimsIdentity>(null);
// check the credentials
if (await _userManager.CheckPasswordAsync(userToVerify, password))
{
return await Task.FromResult(_jwtFactory.GenerateClaimsIdentity(userName, userToVerify.Id));
}
// Credentials are invalid, or account doesn't exist
return await Task.FromResult<ClaimsIdentity>(null);
}
作者总是使用await Task.FromResult<ClaimsIdentity>(...),即使返回null。我不是 Task-await 模式的专家,我会编写类似这样的方法;
private async Task<ClaimsIdentity> GetClaimsIdentity(string userName, string password)
{
if (string.IsNullOrEmpty(userName) || string.IsNullOrEmpty(password))
return null;
// get the user to verifty
var userToVerify = await _userManager.FindByNameAsync(userName);
if (userToVerify == null) return null;
// check the credentials
if (await _userManager.CheckPasswordAsync(userToVerify, password))
{
return _jwtFactory.GenerateClaimsIdentity(userName, userToVerify.Id);
}
// Credentials are invalid, or account doesn't exist
return null;
}
两者都编译。这两种方法有什么区别(如果有的话)?以这种方式使用await Task.FromResult<ClaimsIdentity>(null)有什么好处吗?
【问题讨论】:
-
这是浪费可打印字符和冗余代码的完美示例。更不用说可能是另一个
IAsyncStateMachine实现 -
你问过代码作者同样的问题吗?
-
这会围绕已经完成的结果构造一个新任务,所以不,在这种情况下使用 Task.FromResult 没有意义。此方法用于返回任务的非异步方法。
-
你可以在这里查看the difference
-
await Task.FromResult除了浪费 CPU 周期外什么都不做。 PS:显然这段代码的来源是fullstackmark.com/post/13/…,它可能是通过将非异步方法自动重构为异步方法而创建的,因为作者使用其他地方的异步方法中的普通returns。
标签: c# .net-core async-await