C# 如何使C中的等待函数正确工作?
我有一个Kinect的程序,应该从50帧中提取骨架,计算平均值并绘制出来。 将异步事件处理程序添加到SkeletonFrameReadyC# 如何使C中的等待函数正确工作?,c#,asynchronous,kinect,kinect-sdk,C#,Asynchronous,Kinect,Kinect Sdk,我有一个Kinect的程序,应该从50帧中提取骨架,计算平均值并绘制出来。 将异步事件处理程序添加到SkeletonFrameReady 您应该更具体地说明他们似乎没有完成工作,并且返回的值不正确。准确地陈述你观察到的情况,以及与你预期的情况有何不同。还有,返回点Task.Run=>vectors;?所要做的就是生成一个线程,该线程只返回存储在vectors局部变量中的list对象,此时该变量已经完全初始化。您是否愿意将整个方法体放在Run方法的lambda expression参数中,以便异步
您应该更具体地说明他们似乎没有完成工作,并且返回的值不正确。准确地陈述你观察到的情况,以及与你预期的情况有何不同。还有,返回点Task.Run=>vectors;?所要做的就是生成一个线程,该线程只返回存储在vectors局部变量中的list对象,此时该变量已经完全初始化。您是否愿意将整个方法体放在Run方法的lambda expression参数中,以便异步完成工作?我在这个方法中看不到任何异步内容。它同步构建Vector3D列表,然后将其包装到任务中。如果要同步执行工作,为什么需要该任务?对于初学者来说,您的方法似乎需要类似以下静态异步任务getCoordinatesofJointsSkeleton的内容。同样,在foreach循环中,您还需要将await命令分配给某个对象。您能给我一个示例,说明如何将其应用到运行中吗方法的lambda表达式?lambda的表达不是我最强烈的side@helena.lissenko:为什么要使用async和Wait?
private async void InitSkeletonEvent(object sender,SkeletonFrameReadyEventArgs e)
{
List<Vector3D> vectors = new List<Vector3D>();
double[,] coordinates = new double[50, 3];
double[,] finalCoordinates = new double[50, 3];
using (SkeletonFrame initSkeletonFrame = e.OpenSkeletonFrame())
{
if (initSkeletonFrame != null)
{
if (initSkeletons == null)
{
initSkeletons = new Skeleton[initSkeletonFrame.SkeletonArrayLength];
}
initSkeletonFrame.CopySkeletonDataTo(initSkeletons);
Skeleton initSkeleton = initSkeletons.Where(s => s.TrackingState == SkeletonTrackingState.Tracked).FirstOrDefault();
if (initSkeleton != null)
{
foreach (Skeleton s in initSkeletons)
{
// Get all tracked Skeletons for the 50 frames
while (frame < maxFrames)
{
frame += 1;
vectors = await getCoordinatesofJoints(initSkeleton);
coordinates = await getCoordinatesPerJoint(vectors);
}
}
// Remove the event from SkeletonFrame
this.sensor.SkeletonFrameReady -= InitSkeletonEvent;
finalCoordinates = await getAverageCoordinateForJoint(coordinates);
skeleton = await getAvgSkeleton(finalCoordinates);
}
}
}
}
private Task<List<Vector3D>> getCoordinatesofJoints(Skeleton s)
{
List<Vector3D> vectors = new List<Vector3D>();
foreach (Joint j in s.Joints)
{
Vector3D tmp = new Vector3D(j.Position.X, j.Position.Y, j.Position.Z);
vectors.Add(tmp);
}
return Task.Run(() => vectors);
}