Parallel.For用于光栅图像处理

时间:2012-11-01 11:02:56

标签: c# parallel-processing parallel-for

我想加快我的代码速度。我希望这个代码段更快地运行。我试图创建自己的Parallel.For循环实现,但我失败了。没有错误,但tifDS似乎是空的:/ any1可以帮助我吗?提前谢谢!

原始循环:

for (int iY = 0; iY < srcDS.RasterYSize; iY++)
{
    byte[] srcData = new byte[srcDS.RasterXSize * 1];
    srcBand.ReadRaster(0, iY, srcDS.RasterXSize, 1, srcData, srcDS.RasterXSize, 1, 0, 0);

    for (int iBand = 0; iBand < _outBands; iBand++)
    {
        int[] bandLookup = lookup[iBand];

        int[] dstData = new int[srcData.Count()];
        for (int index = 0; index < srcData.Count(); index++)
        {
            byte b = srcData[index];
            dstData[index] = bandLookup[b];
        }

        tifDS.GetRasterBand(iBand + 1).WriteRaster(0, iY, srcDS.RasterXSize, 1, dstData,
                                                   srcDS.RasterXSize, 1, 0, 0);
    }
}

我的尝试:

for (int iY = 0; iY < srcDS.RasterYSize; iY++)
{
    byte[] srcData = new byte[srcDS.RasterXSize * 1];
    srcBand.ReadRaster(0, iY, srcDS.RasterXSize, 1, srcData, srcDS.RasterXSize, 1, 0, 0);

    Parallel.For<object>((long) 0, _outBands, () => 0,
                         (iBand, state, subtotal) =>
                             {
                                 int[] bandLookup = lookup[iBand];

                                 int[] dstData = new int[srcData.Count()];
                                 for (int index = 0; index < srcData.Count(); index++)
                                 {
                                     byte b = srcData[index];
                                     dstData[index] = bandLookup[b];
                                 }

                                 return new object[] {iBand, dstData};
                             },
                         o =>
                             {
                                 int iBand = (int) (o as object[])[0];
                                 int[] dstData = (o as object[])[1] as int[];
                                 lock (_getRasterBandLock)
                                 {
                                     tifDS.GetRasterBand(iBand + 1).WriteRaster(0, iY, srcDS.RasterXSize, 1, dstData,
                                                   srcDS.RasterXSize, 1, 0, 0);
                                 }
                             });
}

0 个答案:

没有答案