Распараллеливание некоторых LINQ to XML - PullRequest
0 голосов
/ 25 февраля 2011

Как я могу заставить этот код работать параллельно?

List<Crop> crops = new List<Crop>();
//Get up to 10 pages of data.
for (int i = 1; i < 10; i++)
{
    //i is basically used for paging.
    XDocument document = XDocument.Load(string.Format(url, i));

    crops.AddRange(from c in document.Descendants("CropType")
                   select new Crop
                   {
                       //The data here.
                   });
}

Ответы [ 2 ]

2 голосов
/ 25 февраля 2011

Как насчет этого:

var list = (from i in ParallelEnumerable.Range(1, 10)
            from c in XDocument.Load(string.Format(url, i))
                               .Descendants("CropType")
            select new Crop
            {
                //The data here.
            }).ToList();

Это в основном то же самое, что и код Джеффа М., но в формате выражения запроса.

Обратите внимание на две вещи:

  • Ваш исходный код фактически производит только 9 документов, а не 10. Настройте мой код так, чтобы он соответствовал
  • Результаты будут , а не обязательно будут в исходном порядке.Если вам нужно заказать, используйте метод AsOrdered.
2 голосов
/ 25 февраля 2011

Я не знаю, почему вы хотели бы распараллелить это, я подозреваю, что накладные расходы затормаживают вашу программу, поскольку вы не делаете ничего действительно значительного.Но для перевода, я полагаю, это подойдет.Я не знаю, что вы хотите параллельно, так что предположим, что вы хотите, чтобы цикл работал параллельно:

var crops =
    ParallelEnumerable.Range(1, 9)
        .SelectMany(i =>
            XDocument.Load(string.Format(url, i))
                     .Descendants("CropType")
                     .Select(c => new Crop
                      {
                          // The data here
                      })
         )
        .ToList();
...