【问题标题】:How to call the method that returns Task<T> in a boolean return method如何在布尔返回方法中调用返回 Task<T> 的方法
【发布时间】:2020-05-18 16:49:39
【问题描述】:
public interface IAuthenticationService
{
    Task<TurnaResponse> RegisterUser(User user);

    Task<TurnaResponse> LoginUser(string email, string password);

    Task<TurnaResponse> ResetPassword(string userId, string password);

    Task<TurnaResponse> ForgotPassword(string email);

    Task<TurnaResponse> ProcessSession(string userId);

    bool IsUserAuthenticated();
}

public async Task<TurnaResponse> ProcessSession(string userId)
{
    UriBuilder builder = new UriBuilder(ApiConstants.BaseApiUrl)
    {
        Path = ApiConstants.ProcessSessionEndpoint
    };

    var query = System.Web.HttpUtility.ParseQueryString(builder.Query);
    query["userId"] = userId;
    builder.Query = query.ToString();

    var result = await _genericRepository.GetAsync<TurnaResponse>(builder.ToString(), "");
    result.Data = result.Data != null
        ? JsonConvert.DeserializeObject<User>(result.Data.ToString()) : result.Data;

    _sessionResponse = (TurnaResponse)result;

    return result;
}

如何调用下面的 ProcessSession 方法来获取返回 boolean 的 IsAuthenticated 方法中的响应对象?

public bool IsUserAuthenticated()
{
    var result = !string.IsNullOrEmpty(_settingsService.UserIdSetting);

    if (result)
    {
        ProcessSession(_settingsService.UserIdSetting);

        result = _sessionResponse.Status;
    }

    return result;
}

【问题讨论】:

  • 您可以按照以下答案中的建议将其转换为异步方法或调用 Sync-over-Async (这将冻结当前线程,直到该方法返回结果)。 _sessionResponse = ProcessSession(_settingsService.UserIdSetting).GetAwaiter().GetResult();
  • 我试过这个,但是在它调用并从 API 方法中获取响应之后,它并没有带给 xamarin 代码。我想异步方法会引起混乱。
  • 可能会导致死锁。然后使用答案。

标签: c# xamarin asynchronous


【解决方案1】:

使用异步/等待

public async Task<bool> IsUserAuthenticated()
{
    var result = !string.IsNullOrEmpty(_settingsService.UserIdSetting);

    if (result)
    {
        var _sessionResponse = await ProcessSession(_settingsService.UserIdSetting);

        result = _sessionResponse.Status;
    }

    return result;
}

【讨论】:

    【解决方案2】:

    如果你真的想从同步方法中调用异步方法,你可以看看这个线程How to call asynchronous method from synchronous method in C#?。关于这个话题有很多解释。

    【讨论】:

      【解决方案3】:

      我会避免重复使用非描述性的 bool 变量 result 在不同的上下文中表示不同的东西。

      public async Task<bool> IsUserAuthenticatedAsync()
      {
          if (String.IsNullOrEmpty(_settingsService.UserIdSetting)) return false;
          var sessionResponse = await ProcessSessionAsync(_settingsService.UserIdSetting);
          return sessionResponse.Status; // Assuming Status is a boolean property
      }
      

      我添加了Async 后缀以符合guidelines。我还从局部变量_sessionResponse 中删除了similar reasons 的下划线前缀。

      【讨论】:

        【解决方案4】:
        use following code
        
        
        public async Task<bool> IsUserAuthenticated()
        {
            var userId= _settingsService.UserIdSetting;
            if (!string.IsNullOrEmpty(userId)) 
            {
                var _sessionResponse = await ProcessSession(userId);
                result = _sessionResponse.Status;
            }
            return result;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-08-14
          • 1970-01-01
          • 2016-09-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-05
          • 2015-01-01
          相关资源
          最近更新 更多