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)); }