public async Task <IActionResult> GetLondonPeople( IRestApi innerApi, ILogger log) { try { //RestApi innerApi = new RestApi(BASE_URL); var allTask = innerApi.GetEndPointAsync(ALL_USERS_ENDPOINT); var ctyTask = innerApi.GetEndPointAsync(CTY_USERS_ENDPOINT); JArray cityUsers = new JArray(); JToken[] ldnUsers = new JToken[0]; var allTasks = new List <Task> { allTask, ctyTask }; while (allTasks.Any()) { Task finished = await Task.WhenAny(allTasks); if (finished == allTask) { if (finished.IsCompletedSuccessfully) { // Filter users on location var users = JArray.Parse(allTask.Result); var london = new Locale(LONDON_LAT, LONDON_LONG, DISTANCE_FROM_CENTER); ldnUsers = users.Where(u => london.IsLocationInLocale((double)u["latitude"], (double)u["longitude"])).ToArray(); } else { return(new ObjectResult(new ObjectResult(new { statusCode = System.Convert.ToInt32(allTask.Result), message = "Http Error" }))); } } else if (finished == ctyTask) { if (finished.IsCompletedSuccessfully) { cityUsers = JArray.Parse(ctyTask.Result); } else { return(new ObjectResult(new ObjectResult(new { statusCode = System.Convert.ToInt32(ctyTask.Result), message = "Http Error" }))); } } allTasks.Remove(finished); } var res = ldnUsers.Concat(cityUsers); // Remove Duplicates res = res.GroupBy(j => j["id"]).Select(g => g.First()); return(new OkObjectResult(JsonConvert.SerializeObject(res))); } catch (Exception ex) { return(new ExceptionResult(ex, true)); } }