2015-04-12 91 views
1

我有一個API,它可以從我的數據庫返回商店列表以及來自Google Places API的商店。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; 

的事情是,它需要很長的時間和處理來自谷歌API的結果(我做的背景更多的工作),我不知道是否有一種方法可以從得到第一個數據我數據庫 - 將這些數據返回給客戶端,然後再從Google Api和Return中獲取更多數據 - 這樣客戶端就可以快速獲得第一個結果,然後從Google API中獲取第一個結果。

+1

無論您的通話做IO。一個用於DB,一個用於Google。我建議通過使用自然的異步API來同時調用它們,例如通過'HttpClient'和許多ORM提供。然後,你可以在兩者上等待Task.WhenAll'。或者,如果您想要儘快向最終用戶顯示結果,則@ Damir建議創建兩個不同的呼叫也可能奏效。 –

回答

1

如果我是你,我會創建2個不同的web 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;