我正在尝试使用嵌套的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();
}
}
答案 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可以在多个线程中工作。