private async Task <bool> ExecuteLazyOperationsSingleStep(ResponseTimeInformation responseTimeInformation) { var disposables = pendingLazyOperations.Select(x => x.EnterContext()).Where(x => x != null).ToList(); try { var requests = pendingLazyOperations.Select(x => x.CreateRequest()).ToArray(); var responses = await AsyncDatabaseCommands.MultiGetAsync(requests); for (int i = 0; i < pendingLazyOperations.Count; i++) { long totalTime; long.TryParse(responses[i].Headers["Temp-Request-Time"], out totalTime); responseTimeInformation.DurationBreakdown.Add(new ResponseTimeItem { Url = requests[i].UrlAndQuery, Duration = TimeSpan.FromMilliseconds(totalTime) }); if (responses[i].RequestHasErrors()) { throw new InvalidOperationException("Got an error from server, status code: " + responses[i].Status + Environment.NewLine + responses[i].Result); } pendingLazyOperations[i].HandleResponse(responses[i]); if (pendingLazyOperations[i].RequiresRetry) { return(true); } } return(false); } finally { foreach (var disposable in disposables) { disposable.Dispose(); } } }
/// <summary> /// Begins the async multi load operation /// </summary> /// <param name="ids">The ids.</param> /// <returns></returns> public Task <T[]> MultiLoadAsync <T>(string[] ids) { IncrementRequestCount(); return(AsyncDatabaseCommands.MultiGetAsync(ids) .ContinueWith(task => task.Result.Select(TrackEntity <T>).ToArray())); }