C# 为什么使用Task.FromResult<;T>;(T结果)来自包含等待的方法?

C# 为什么使用Task.FromResult<;T>;(T结果)来自包含等待的方法?,c#,.net-core,async-await,C#,.net Core,Async Await,我在一个教程中遇到了以下方法: private async Task<ClaimsIdentity> GetClaimsIdentity(string userName, string password) { if (string.IsNullOrEmpty(userName) || string.IsNullOrEmpty(password)) return await Task.FromResult<ClaimsIde

我在一个教程中遇到了以下方法:

    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);
    }
private异步任务GetClaimsIdentity(字符串用户名、字符串密码)
{
if(string.IsNullOrEmpty(用户名)| | string.IsNullOrEmpty(密码))
返回等待任务.FromResult(空);
//让用户访问verifty
var userToVerify=await\u userManager.FindByNameAsync(用户名);
if(userToVerify==null)返回wait Task.FromResult(null);
//检查凭证
if(wait_userManager.CheckPasswordAsync(userToVerify,password))
{
返回wait Task.FromResult(_jwtFactory.GenerateClaimsIdentity(userName,userToVerify.Id));
}
//凭据无效,或帐户不存在
返回等待任务.FromResult(空);
}
作者始终使用
wait Task.FromResult(…)
,即使返回null也是如此。我不是任务等待模式的专家,我会写这样的方法

    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;
    }
private异步任务GetClaimsIdentity(字符串用户名、字符串密码)
{
if(string.IsNullOrEmpty(用户名)| | string.IsNullOrEmpty(密码))
返回null;
//让用户访问verifty
var userToVerify=await\u userManager.FindByNameAsync(用户名);
if(userToVerify==null)返回null;
//检查凭证
if(wait_userManager.CheckPasswordAsync(userToVerify,password))
{
返回_jwtFactory.GenerateClaimsIdentity(用户名,userToVerify.Id);
}
//凭据无效,或帐户不存在
返回null;
}

两者都可以编译。这两种方法之间有什么区别(如果有的话)?以这种方式使用
wait Task.FromResult(null)
有什么好处吗?

根据我找到的关于
Task的最佳stackoverflow答案。FromResult

Task.FromResult
的使用仅适用于同步方法和模拟的上下文。因此,当您只想返回结果时,在async方法中使用它是多余的-不会给您带来任何额外的好处,而且asyncGuidence没有说明如何使用
任务。在async方法中,FromResult


因此,在异步方法中使用
Task.FromResult
是不必要的,它会使代码膨胀,不会给您带来任何实际好处。

这是浪费可打印字符和冗余代码的完美例子。更不用说另一个
IAsyncStateMachine
实现了您是否向代码作者询问了相同的问题?这将围绕已完成的结果构造一个新任务,因此,在本例中,没有必要使用task.FromResult。此方法用于返回任务的非异步方法。您可以在此处签出
等待任务。FromResult
除了浪费CPU周期外,什么都不做。PS:显然,这段代码的源代码是,它可能是通过将非异步方法自动重构为异步方法而创建的,由于作者使用其他异步方法的正常
return
s。是什么使该答案成为“最佳stackoverflow答案”?此答案的作者是Stephen Cleary,而Stephen掌握了大量知识,将其标记为“最佳stackoverflow答案”是一个大胆的说法。stackoverflow上有成千上万的答案。@BART谢谢你的回答,你说这是你找到的关于这个特定问题的最好答案,并不是说这绝对是stackoverflow上最好的答案。您也给予了其他人应有的信任,并提供了到原始来源的链接。@mark_h请注意,我的评论是关于以前版本的答案的。