2012-03-13 155 views
0

來電的功能是它可以做到以下要求在C#4.0異步回從foreach循環

電流: 我有一個數據提供者類查詢DB/XML/ExternalDataSource 如下圖所示,函數PerformQuery需要兩個參數並返回一個Result類型的列表。

在我的客戶端應用程序中,DataProvider實例調用PerformQuery將創建列表並返回。

目標: 如果PerformQuery的查詢結果更多(例如100K),那麼用戶將不得不等待。 所以我可以創建一個backgroundworker,並通過PerformQuery返回列表。

但我想知道PerformQuery是否可以將其foreach語句中的每個項目返回給同步或異步模式的調用者函數。而不是等待在foreach語句中構建整個列表,然後再次在客戶端應用程序中處理列表。

來電 - > PerformQuery(a,b) ^ |^ | | | |將每個結果項目發回給呼叫者功能。 < --------- <

 

    class DataProvider 
    { 
     public List PerformQuery(string param1, string param2) 
     { 
      List m_res = new List(); 

      var m_queryRes = DataAccessor.GetResults(param1, param2); 

      foreach(var res in m_queryRes) 
      {  
        Result result = new Result(); 
        result.Name = res.FirstName + res.SecondName; 
        result.Code = res.Code + "Some business logic"; 
        m_res.Add(result);    
      } 

      return m_res; 
     } 
    } 
    class Result 
    { 
     Property Name; 
     Property Code; 
    } 

+0

應該注意的是,當您調用DataAccessor.GetResults()時,會出現重大的性能下降。 – 2012-03-13 18:11:27

回答

3

您應該考慮使用iterators,迭代器你可以根據呼叫方的請求時返回的每個元素。

class DataProvider 
{ 
    public System.Collections.IEnumerable<Result> PerformQuery(string param1, string param2) 
    { 
     var m_queryRes = DataAccessor.GetResults(param1, param2); 

     foreach(var res in m_queryRes) 
     {  
       Result result = new Result(); 
       result.Name = res.FirstName + res.SecondName; 
       result.Code = res.Code + "Some business logic"; 
       yield return result;    
     } 

    } 
} 
class Result 
{ 
    Property Name; 
    Property Code; 
} 
+0

對不起,我的延遲響應..有幾天有限的互聯網接入。 – 2012-03-20 02:31:50

+1

真的很有效力:一角錢...... :-)坦克一百萬.. – 2012-03-20 02:32:30