【问题标题】:Have a method that may or may not be async. How to handle?有一个可能是也可能不是异步的方法。如何处理?
【发布时间】:2018-07-17 19:43:48
【问题描述】:

我有一种方法可以通过检查所有凭据或使用刷新令牌来取回令牌。

  public TokenDto GenerateAuthToken(TokenRequestDto dto)
        {
            switch (dto.GrantType)
            {
                case "password":
                    return GetToken(dto.ClientId, dto.Email, dto.Password); 
                case "refresh_token":
                    return GetRefreshToken(dto.RefreshToken);
                default:
                    return null;
            }
        }

GetToken 是异步的,因为我使用的是 asp.net 身份,并且内置方法是异步的。 GetRefreshToken 没有任何异步。

我应该将 GetRefreshToken 标记为异步还是有更好的方法?

【问题讨论】:

    标签: c# asp.net-core async-await asp.net-core-2.0


    【解决方案1】:

    如果GetRefreshToken 是同步方法,我不会撒谎,将其标记为Task<T>。相反,我宁愿让调用者使用已完成的任务

    public Task<TokenDto> GenerateAuthToken(TokenRequestDto dto)
    {
        switch (dto.GrantType)
        {
            case "password":
                // asynchronous, return the task
                return GetToken(dto.ClientId, dto.Email, dto.Password); 
            case "refresh_token":
                // synchronous, use a completed task
                return Task.FromResult(GetRefreshToken(dto.RefreshToken));
            default:
                // don't return null, throw instead
                throw new ArgumentOutOfRangeException(nameof(dto.GrantType));
        }
    }
    

    【讨论】:

    • 使用Task.FromResult而不是标记方法async并在GetToken调用上使用await有什么好处吗?
    • @gunr2171 好吧,使用async/await 在编译时会生成一个状态机,虽然命中很小,但当你没有继续时,你可以避免它(即await 调用是方法的最后一部分)。两者都是有效的方法
    猜你喜欢
    • 2023-04-02
    • 2014-01-06
    • 2011-01-27
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多