public override async Task <string> ProcessRequestAsync(string query, TimeSpan timeout) { var replica = ReplicaAddresses.ToArray(); replica.Shuffle(rand); foreach (var s in replica) { Console.Write(s + " "); } Console.WriteLine(); var timeoutOneTask = new TimeSpan(timeout.Ticks / ReplicaAddresses.Length); foreach (var replicaAddress in replica) { var webRequest = CreateRequest(replicaAddress + "?query=" + query); Log.InfoFormat("Processing {0}", webRequest.RequestUri); var resultTask = ProcessRequestAsync(webRequest); await Task.WhenAny(resultTask, Task.Delay(timeoutOneTask)); if (!resultTask.IsCompleted) { continue; } if (resultTask.IsFaulted) { continue; } return(resultTask.Result); } throw new TimeoutException(); }
public override async Task <string> ProcessRequestAsync(string query, TimeSpan timeout) { var shuffledReplicas = ReplicaAddresses.ToArray(); shuffledReplicas.RandomShuffle(); timeout = TimeSpan.FromTicks(timeout.Ticks / shuffledReplicas.Length); foreach (var task in shuffledReplicas .Select(uri => CreateRequest(uri + "?query=" + query)) .Select(request => ProcessRequestAsync(request))) { if (await Task.WhenAny(task, Task.Delay(timeout)) == task) { return(task.Result); } } throw new TimeoutException(); }
public override async Task <string> ProcessRequestAsync(string query, TimeSpan timeout) { var shuffledReplicas = ReplicaAddresses.ToArray(); shuffledReplicas.RandomShuffle(); timeout = TimeSpan.FromTicks(timeout.Ticks / shuffledReplicas.Length); var queries = new List <RequestDescriptor>(); foreach (var uri in shuffledReplicas) { var guid = Guid.NewGuid(); var request = CreateRequest(uri + "?query=" + query + "&guid=" + guid); var task = ProcessRequestAsync(request); queries.Add(new RequestDescriptor(uri, guid, task)); var finishedTask = await Task.WhenAny(queries .Select(d => d.Task) .Concat(new[] { Task.Delay(timeout) })); if (!(finishedTask is Task <string>)) { continue; } foreach (var _ in queries .Where(d => d.Task != finishedTask) .Select(d => CreateRequest(d.Uri + "?abort=" + "&guid=" + d.Guid)) .Select(r => ProcessRequestAsync(r))) { ; } return((finishedTask as Task <string>).Result); } throw new TimeoutException(); }