在嵌套的Parallel.For循环中使用WriteLine时的IndexOutofRangeException

时间:2012-11-04 12:56:03

标签: c# wpf kinect-sdk

我正在尝试使用嵌套的Parallel.For循环使用以下代码将kinect深度数据写入文本文件。但是,它给出了IndexOutofRangeException

如果使用简单的for循环,代码工作正常,但它会挂起UI,因为深度格式设置为640x480,导致循环在307200 lines的文本文件中写入30fps

因此,我切换到了Parallel。对于计划。如果我从嵌套循环中省略writeLine命令,则代码工作正常,这表示IndexOutofRangeException在writeline命令中出现。我不知道如何解决这个问题。请指教。

任何更好的解决方法可以避免UI冻结?

感谢。

using (DepthImageFrame depthImageframe = d.OpenDepthImageFrame())
            {
                if (depthImageframe == null)
                    return;
                depthImageframe.CopyPixelDataTo(depthPixelData);

                swDepth = new StreamWriter(@"E:\depthData.txt", false);
                int i = 0;

                Parallel.For(0, depthImageframe.Width, delegate(int x)
                {
                    Parallel.For(0, depthImageframe.Height, delegate(int y)
                    {
                        p[i] = sensor.MapDepthToSkeletonPoint(depthImageframe.Format,
                                x, y, depthPixelData[x + depthImageframe.Width * y]);
                        swDepth.WriteLine(i + "," + p[k].X + "," + p[k].Y + "," + p[k].Z);
                        i++;
                    });
                });            

                swDepth.Close();

            }
        }

1 个答案:

答案 0 :(得分:4)

我认为问题不在于IndexOutofRange。您只看到IndexOutofRangeException,因为StreamWriter的某些内部实现。主要问题是您正在使用来自多个线程的swDepth.WriteLine。这就解释了为什么你的代码适用于普通的fors,但是并行fors失败了。

检查链接 http://msdn.microsoft.com/en-us/library/system.io.streamwriter.aspx。它说只有StreamWriter的静态成员是线程安全的。

要解决此问题,请更换

swDepth.WriteLine(i + "," + p[k].X + "," + p[k].Y + "," + p[k].Z);

lock(someSyncObject)
    swDepth.WriteLine(i + "," + p[k].X + "," + p[k].Y + "," + p[k].Z);

还要确保sensor.MapDepthToSkeletonPoint可以在多个线程中工作。