Esempio n. 1
0
        public async Task <List <Tour> > Search(SearchPattern searchPattern)
        {
            var request = new ToursRequest(Guid.NewGuid())
            {
                SearchPattern = searchPattern
            };

            // делаем так для того чтобы прервать ожидание, если все провайдеры ответили до истечения таймаута
            _providerNotResponded.TryAdd(request.RequestId, _messageBusClient.GetSubscriberCount <ToursRequest>());

            //отправляем поисковый запрос
            _messageBusClient.SendMessage(request);

            // ожидаем ответа от всех провайдеров, если ответили все до истечения таймаута ожидание будет отменено
            try
            {
                await Task.Delay(_options.Value.RequestTimeout, _delayTokenSource.Token);
            }
            catch (TaskCanceledException)
            {
            }

            List <Tour> result = new List <Tour>();

            _results.TryRemove(request.RequestId, out result);

            return(HandleResults(result, (ToursOrderEnum)searchPattern.ToursOrder));
        }
        private async Task <T> DoRequest <T>(Request request)
        {
            // делаем так для того чтобы прервать ожидание, если все провайдеры ответили до истечения таймаута
            _providerNotResponded.TryAdd(request.RequestId, _messageBusClient.GetSubscriberCount(request.GetType()));
            _messageBusClient.SendMessage(request);
            await Wait();

            return(GetResult <T>(request.RequestId));
        }