Параллельная загрузка изображений в LINQ


Я экспериментирую с parallel и LINQ. Посмотрите на код ниже. Это работает, но только чтобы получить идею:

private void LoadImages(string path)
{
    images =
        Directory.GetFiles(path)
        .Select(f => GetImage(f))
        .ToList();
}

private Image GetImage(string path)
{
    return Image.FromFile(path);
}

Таким образом, я в основном получаю изображение из каждого файла, найденного в указанном каталоге. Вопрос в том-как провести эту параллель? Прямо сейчас это похоже на повторение их. Я хотел бы распараллелить его "как-нибудь". Так или иначе, потому что я слишком неопытен, чтобы предложить идею, как этого достичь, поэтому я прошу вас, ребята, рассчитывая на некоторую помощь, чтобы сделать это быстрее :)

2 3

2 ответа:

Использование PLINQ:

var images=(from file in Directory.EnumerateFiles(path).AsParallel()
           select GetImage(file)).ToList();

Чтение изображений не связано с процессором, поэтому вы можете указать более высокую степень параллелизма:

var images=(from file in Directory.EnumerateFiles(path)
                                  .AsParallel()
                                  .WithDegreeOfParallelism(16)
           select GetImage(file)).ToList();

Вы могли бы сделать что-то вроде

var images = new ConcurrentBag<Image>();

Parallel.ForEach(Directory.GetFiles(path)
.Select(f => new { img = GetImage(f) })
.Select(x => x.img), img => images.Add(img));