2015-04-12 2 views
1

У меня есть API, который возвращает список магазинов из моей базы данных вместе с магазинами из API Google Адресов.C# webapi отправить данные после возврата

IEnumerable<ShopInOfferDetails> modelApi = null; 
IEnumerable<ShopInOfferDetails> modelDb = null; 

      await new TaskFactory() 
       .StartNew(() => 
       { 
        modelApi = Service.GetShopsFromGoogleApi(g); 

       }) 
       .ContinueWith(x => 
       { 
        modelDb = Service.GetShopsFromDb(g); 
       }); 


var model = modelApi.Concat(modelDb);  
return model; 

Дело в том, что она занимает слишком много времени, чтобы получить и обработать результаты от Google API (я делаю больше работы на заднем плане), и мне интересно, если есть способ, чтобы получить первые данные из моего database - вернуть эти данные клиенту и только затем получить больше данных от Google Api и Return снова - таким образом, клиент получает первый результат быстро, а затем остальное от Google API.

+1

Оба вызовы делают IO. Один для БД и один для Google. Я бы предложил использовать их параллельно, используя их естественно асинхронные API, такие, которые предлагаются через 'HttpClient' и многие ORM. Тогда вы можете «ждать Task.WhenAll» на обоих. Альтернативно, предложение Дамира о создании двух разных вызовов также может работать, если вы хотите показать конечным пользователям результат ASAP. –

ответ

1

Если бы я был вами, я бы создал два разных метода веб-API и вызывал их асинхронно с клиента. Когда каждый из них возвращается, клиент может сразу показать результаты - это создаст желаемый эффект: пользователь сначала увидит результаты из базы данных, а затем более медленные из Google API.

+0

Я думал об этом варианте, но я хотел бы контролировать количество результатов. Если я получу достаточно из своей базы данных, я не вернусь от Google. Если я не найду решение, что я буду делать. – Eyal

0

Я бы реорганизовать это немного:

List<ShopInOfferDetails> items = new List<ShopInOfferDetails>(); 

List<Task<IEnumerable<ShopInOfferDetails>>> tasks = new List<Task<IEnumerable<ShopInOfferDetails>>>(); 
var task1 = Task.Run(() => { 
    items.AddRange(Service.GetShopsFromGoogleApi(g)); 
    }); 
tasks.Add(task1); 
var task2 = Task.Run(() => { 
    items.AddRange(Service.GetShopsFromDb(g)); 
    }); 
tasks.Add(task2); 

Task.WaitAll(tasks.ToArray()); 

return items; 
Смежные вопросы