Зачем использовать Task.FromResult <T>(T result) из метода, который ожидает? - PullRequest
2 голосов
/ 10 февраля 2020

Я наткнулся на следующий метод в руководстве:

    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>(...) даже при возврате нуля. Я не эксперт в паттерне 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) таким образом?

1 Ответ

3 голосов
/ 10 февраля 2020

Согласно наилучшему ответу stackoverflow, который я нашел о Task.FromResult: { ссылка }

Использование Task.FromResult подходит только в контексте синхронных методов и насмешек , Поэтому использование его в методе asyn c, когда вы просто хотите вернуть результат, является излишним - не дает никаких дополнительных преимуществ, также AsyncGuidance ничего не говорит об использовании Task.FromResult в методе asyn c: https://github.com/davidfowl/AspNetCoreDiagnosticScenarios/blob/master/AsyncGuidance.md

Так что AFAIK с использованием Task.FromResult в asyn c метод не требуется , раздувает ваш код и не дает никаких реальных преимуществ.

...