异步从foreach循环返回调用函数

时间:2012-03-13 17:38:30

标签: c# asynchronous

是否可以在C#4.0中执行以下要求

当前 我有一个数据提供程序类,用于查询DB / XML / ExternalDataSource 如下所示,函数PerformQuery接受两个参数并返回Result类型列表。

在我的客户端应用程序中,DataProvider调用PerformQuery的实例将创建列表并返回。

目的: 如果PerformQuery的查询结果更多(例如100K),那么用户将不得不等待。 所以我可以创建一个后台工作程序和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;
    }

1 个答案:

答案 0 :(得分: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;
}