代码之家  ›  专栏  ›  技术社区  ›  mark_h

为什么要从包含awaits的方法中使用Task.FromResult<T>(T result)?

  •  1
  • mark_h  · 技术社区  · 6 年前

    我在一个教程中碰到了下面的方法;

        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>(...)

        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) 以这种方式?

    0 回复  |  直到 6 年前
        1
  •  3
  •   BART    6 年前

    根据我找到的最好的stackoverflow答案 Task.FromResult https://stackoverflow.com/a/19696462/6440521

    使用 任务.FromResult 异步 异步制导 不说任何关于使用 在一个 异步 方法: https://github.com/davidfowl/AspNetCoreDiagnosticScenarios/blob/master/AsyncGuidance.md

    所以阿飞用 任务.FromResult 在一个 异步 方法是不必要的,它会使代码膨胀,并且不会给您带来真正的好处。