2012-03-13 161 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