在LINQ中并行加载图像

时间:2015-03-05 17:32:51

标签: c# performance linq asynchronous image-loading

我正在尝试并行和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 个答案:

答案 0 :(得分:4)

使用PLINQ:

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

读取图像不受CPU限制,因此您可以指定更高程度的并行度:

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

答案 1 :(得分:2)

您可以执行类似

的操作
var images = new ConcurrentBag<Image>();

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