我正在尝试使用并行处理来加速几个嵌套循环,但我无法正确使用语法。我试图计算位图中有多少像素是红色、白色或黑色,这是我在其他地方的枚举中的值。
在串行处理中,我有以下代码,可以正常工作:
Bitmap image = new Bitmap(@"Input.png");
var colourCount = new int[3];
for (var x = 0; x < image.Width; x++)
{
for (var y = 0; y < image.Height; y++)
{
switch (image.GetPixel(x, y).ToArgb())
{
case (int)colours.red: colourCount[0]++; break;
case (int)colours.white: colourCount[1]++; break;
case (int)colours.black: colourCount[2]++; break;
default: throw new ArgumentOutOfRangeException(string.Format("Unexpected colour found: '{0}'", image.GetPixel(x, y).ToArgb()));
}
}
}
我已经看到 Microsoft 和 Stackoverflow 的并行 for 循环代码更新共享变量,如下所示:
Parallel.For<int>(0, result.Count, () => 0, (i, loop, subtotal) =>
{
subtotal += result[i];
return subtotal;
},
(x) => Interlocked.Add(ref sum, x)
);
但是所有示例都使用简单类型(例如 int)作为共享变量,我只是无法弄清楚写入我的大小为 3 的数组的语法。我接近这一切都错了吗?
顺便说一句,就性能而言,我知道 GetPixel 与 Bitmap.LockBits 之类的东西相比非常慢,我只是想弄清并行循环的原理。