Асинхронный возврат к функции вызывающего из цикла foreach - PullRequest
0 голосов
/ 13 марта 2012

Возможно ли выполнить приведенное ниже требование в C # 4.0

Текущий: У меня есть класс поставщика данных, который запрашивает DB / XML / ExternalDataSource Как показано ниже, функция PerformQuery принимаетдва параметра и возвращает список типа Result.

В моем клиентском приложении экземпляр вызова DataProvider для PerformQuery создаст список и возвратит.

Цель: Если результат запроса PerformQuery больше (например, 100K), то пользователю придется подождать.Таким образом, я могу создать фонового работника и обработать список, возвращаемый PerformQuery.

Но я хочу знать, может ли PerformQuery вернуть каждый элемент в своем выражении foreach функции вызывающей стороны в режиме синхронизации или асинхронном режиме.Вместо того, чтобы ждать построения всего списка в операторе foreach и снова обрабатывать список в клиентском приложении.

Вызывающий объект -> PerformQuery (a, b) ^ |||||Отправьте каждый элемент результата функции вызывающей стороны.<--------- <</p>


    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 Ответ

3 голосов
/ 13 марта 2012

Вы должны рассмотреть возможность использования итераторов , с итераторами вы можете возвращать каждый элемент за раз, основываясь на запросе вызывающего абонента.

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...