示例#1
0
        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();
        }