异步调用中的异常扰乱了执行

Exception in asynchronous call messes up execution

我正在打两个 httpClient.GetAsync() 电话。

根据要求,两个调用之一将始终抛出 “未知主机” 异常,一个将 return 一个适当的 HttpResponseMessage 对象.

我的问题是在两个异步 httpClient 调用完成后确定布尔值

public async Task<bool> BothHttpCallsTask(string hostName)
{
    bool response1 = false;
    bool response2 = false;
    try
    {
        //httpClient and the GetAsync() are inside this method
        response1 = await CheckRedirectionBool(url1); 
        response2 = await CheckRedirectionBool(url2);
    }
    catch(Exception e)
    {
        //when exception is caught here, the method evaluates as false
        //as response2  is still not executed
    }
    return response1 || response2 ;
}

如何让执行仅在两个异步调用成功完成时进行评估(请记住,强制性异常会使 return 语句在响应 2 可以从其执行中获取值之前进行评估) 即使两个 http 调用之一成功,我也需要 return true。

你能简单地将每个包装在它自己的异常处理程序中吗? 例如:

try{
 response1 = ...
}
catch(Exception e){
 //set some flag here
}

try{
 response2 = ...
}
catch(Exception e){
 //set some flag here
}

这样您就可以知道哪些过去了,哪些没有过去,并根据该条件设置一些标志,等等。

My problem is determining the bool value only after both async httpClient calls finish.

如果你想像对待返回一样处理异常false,那么我建议写一个小辅助方法:

async Task<bool> TreatExceptionsAsFalse(Func<Task<bool>> action)
{
  try { return await action(); }
  catch { return false; }
}

那么用起来就更方便了Task.WhenAll:

public async Task<bool> BothHttpCallsTask(string hostName)
{
  var results = await Task.WhenAll(
      TreatExceptionsAsFalse(() => CheckRedirectionBool(url1)),
      TreatExceptionsAsFalse(() => CheckRedirectionBool(url2))
  );
  return results[0] || results[1];
}