0

場景:我一直在和一個第三方公司一起主持WCF數據服務3.0,我們只有API訪問他們的web服務,不,我不能使用存儲過程加快速度,因爲我不知道沒有SQL直接訪問權限。如何在WCF數據服務中使用多線程/ pfx來加快速度?

我已經玩PFX了一點,我可能是錯誤的嘗試沿着WCF數據服務使用它。例如

public List<EntityA> GetAEntitiesBy(int customerID) { 
      var result = new List<EntityA>(); 
      int lastResultCount = 50; 
      int callsMade = 0; 

      while (lastResultCount == 50) 
      { 
      var results = MyApiWrapper.CreateODataContext().EntityA.Expand("Customer").Expand("EntityB").AsParallel() 
     .Where(c => c.EntityA.CustomerID == customerID) 
     .Where(c => c.EntityB.IsProperty1True && c.EntityB.Property2TypeID == 1) 
     .Select(c => c) 
     .Skip(callsMade * 50) 
     .Take(50)); 

results.ForAll(c => nodes.Add(c)); 

      callsMade++; 
      lastResultCount = results.Count; 

      } 

     return nodes; 
} 

我明白,我只能每次我化DataServiceQuery時候拉50行最大,我的瓶頸在創建後此功能結果回到我的網頁表單,因爲後來我做了.ForEach和每個排我得到我需要運行其他服務(WCF)

如何加快此操作的任何建議嗎?

另一方面,當我調試此方法時,在並行查詢執行期間調用GetEnumerator時發現錯誤消息「Children could not Be evaluated」。

感謝

回答

1

你當然可以通過並行發出多個查詢,獲得更好的整體吞吐量。您的客戶必須做好準備,以確保回覆將無序到達。 Web服務提供商可能會限制您允許的並行查詢數量。確保你理解並尊重這些限制。如果Web服務已經不是最佳的,取決於其基礎架構的規模,如果您發出太多請求並在一起,則可能會導致收益遞減。

另一種選擇......

它看起來像你獲取與客戶相關的不少實體。您可以考慮在首次呈現網頁時顯示前50個,並使用Ajax查詢以批量形式提取其餘50個。整體吞吐量將比先在服務器端全部獲取它們然後呈現頁面慢一點。但是,用戶體驗可能會好得多(具體取決於頁面上發生的情況)。

+0

Hi @Eric,謝謝你的回覆。我正在使用ObjectCache作爲輸出結果,這個數據顯示在一個Custom jQGrid中(分頁允許10,20,50和他們想要的任何數字,這可能是問題,但是是用戶想要的) – 2013-02-14 17:28:51

+0

您是否想要並行獲取多個頁面的數據? – 2013-02-14 20:00:18

+0

我正在單個頁面中提取單個報表(網格)的數據。 – 2013-02-14 20:40:30