如何将 Parallel.For 转换为 PLINQ
How to convert Parallel.For to PLINQ
Parallel.For(0, Height, new ParallelOptions { MaxDegreeOfParallelism = 6 }, y =>
{
int currentLine = y * BMPData.Stride;
for (int x = 0; x < Width; x = x + BPX)
{
var b = pixels[currentLine + x];
var g = pixels[currentLine + x + 1];
var r = pixels[currentLine + x + 2];
int avg = (r + g + b) / 3;
pixels[currentLine + x] = (byte)avg;
pixels[currentLine + x + 1] = (byte)avg;
pixels[currentLine + x + 2] = (byte)avg;
}
});
这基本上是一个并行代码,它将位图数据像素转换为灰色像素,但是有什么方法可以用 Parallel Linq 替换 Parallel.For
用法吗?我知道这没有意义,但它是某项作业所必需的
您可以使用 Enumerable.Range
和 ForAll
来获得相似的结果。尽管注意 ForAll
不会以任何稳定的顺序处理列表 - 这可能适合您的用例
Enumerable.Range(0,Height)
.AsParallel()
.WithDegreeOfParallelism(6)
.ForAll(y =>
{
/// existing code here
});
The ForAll Operator PLINQ 简介文章中的段落有一个 ForAll 示例,ForAll 似乎非常适合您所做的事情。
此示例可以根据您的情况进行修改
var nums = Enumerable.Range(0, Height);
var query =
from num in nums.AsParallel().WithDegreeOfParallelism(6)
select num;
// Process the results as each thread completes
query.ForAll(e => MakeGray(e));
其中 MakeGray 是您的像素设置方法。
这并不比 Jamiec 的回答好多少,但有更多的毛病,可能是也可能不是您要找的。
顺便说一句。我认为您可以使用
消除第二个 for 循环
Parallel.For(0, Width * Height / BPX, ...)
或
Enumerable.Range(0, Width * Height / BPX).AsParallel()...
和currentLine + x
会变成x
。
Parallel.For(0, Height, new ParallelOptions { MaxDegreeOfParallelism = 6 }, y =>
{
int currentLine = y * BMPData.Stride;
for (int x = 0; x < Width; x = x + BPX)
{
var b = pixels[currentLine + x];
var g = pixels[currentLine + x + 1];
var r = pixels[currentLine + x + 2];
int avg = (r + g + b) / 3;
pixels[currentLine + x] = (byte)avg;
pixels[currentLine + x + 1] = (byte)avg;
pixels[currentLine + x + 2] = (byte)avg;
}
});
这基本上是一个并行代码,它将位图数据像素转换为灰色像素,但是有什么方法可以用 Parallel Linq 替换 Parallel.For
用法吗?我知道这没有意义,但它是某项作业所必需的
您可以使用 Enumerable.Range
和 ForAll
来获得相似的结果。尽管注意 ForAll
不会以任何稳定的顺序处理列表 - 这可能适合您的用例
Enumerable.Range(0,Height)
.AsParallel()
.WithDegreeOfParallelism(6)
.ForAll(y =>
{
/// existing code here
});
The ForAll Operator PLINQ 简介文章中的段落有一个 ForAll 示例,ForAll 似乎非常适合您所做的事情。
此示例可以根据您的情况进行修改
var nums = Enumerable.Range(0, Height);
var query =
from num in nums.AsParallel().WithDegreeOfParallelism(6)
select num;
// Process the results as each thread completes
query.ForAll(e => MakeGray(e));
其中 MakeGray 是您的像素设置方法。
这并不比 Jamiec 的回答好多少,但有更多的毛病,可能是也可能不是您要找的。
顺便说一句。我认为您可以使用
消除第二个 for 循环Parallel.For(0, Width * Height / BPX, ...)
或
Enumerable.Range(0, Width * Height / BPX).AsParallel()...
和currentLine + x
会变成x
。