如何在csharp中进行解锁调用
How to make a unblocking call in csharp
我正在开发一个 Kinect 应用程序,它 age/gender classification.I 已经开发了一个代码,可以拍摄颜色流的快照,在裁剪头部关节周围的图像后,将对头部关节进行性别分类使用 face++ 的图像 api.
System.Timers.Timer myTimer = new System.Timers.Timer();
myTimer.Elapsed += new ElapsedEventHandler(TakeImagesTimely);
myTimer.Interval = 20000; // 1000 ms is one second
myTimer.Start();
public void TakeImagesTimely(object source, ElapsedEventArgs e)
{
this.Dispatcher.Invoke((Action)(() =>
{
// code here will run every 20 second
if (X == 0 || Y == 0) { Console.WriteLine("sdsds"); return; }
screen("Kinect123", faceImg);
String myPhotos = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);
Bitmap bmp = new Bitmap(System.IO.Path.Combine(myPhotos, "Kinect123" + ".png"));
Bitmap bmpCrop = CropBitmap(bmp, X - 100, Y - 30, 200, 100);
BitmapSource bmpCropSrc = ConvertBitmap(bmpCrop);
if (bmpCrop == null || bmpCropSrc == null) { return; }
screen1("Kinect789", bmpCropSrc);
}));
}
这里的screen函数对color stream进行快照,然后在头部坐标周围裁剪图像后,screen1函数将裁剪后的图像上传到云端并调用face++ api for age/gender分类。
我的问题是 screen1 函数需要 3-4 秒来进行分类,这会挂起来自 kinect.I 的连续流式传输,我知道我必须使用 asynch/unblocking 调用 screen1 函数但无法确定怎么做。
请指导我解决这个问题。
尝试将 screen1 调用包装在 async
任务中。
示例:
Task screen1Task = Task.Run( () => {
screen1("Kinect789", bmpCropSrc);
});
这将要求您在父方法上声明 async
关键字。如果您不希望它成为 "fire and forget"。
,您还需要在某些时候 await
screen1Task
更多示例:https://msdn.microsoft.com/en-us/library/hh195051%28v=vs.110%29.aspx
我正在开发一个 Kinect 应用程序,它 age/gender classification.I 已经开发了一个代码,可以拍摄颜色流的快照,在裁剪头部关节周围的图像后,将对头部关节进行性别分类使用 face++ 的图像 api.
System.Timers.Timer myTimer = new System.Timers.Timer();
myTimer.Elapsed += new ElapsedEventHandler(TakeImagesTimely);
myTimer.Interval = 20000; // 1000 ms is one second
myTimer.Start();
public void TakeImagesTimely(object source, ElapsedEventArgs e)
{
this.Dispatcher.Invoke((Action)(() =>
{
// code here will run every 20 second
if (X == 0 || Y == 0) { Console.WriteLine("sdsds"); return; }
screen("Kinect123", faceImg);
String myPhotos = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);
Bitmap bmp = new Bitmap(System.IO.Path.Combine(myPhotos, "Kinect123" + ".png"));
Bitmap bmpCrop = CropBitmap(bmp, X - 100, Y - 30, 200, 100);
BitmapSource bmpCropSrc = ConvertBitmap(bmpCrop);
if (bmpCrop == null || bmpCropSrc == null) { return; }
screen1("Kinect789", bmpCropSrc);
}));
}
这里的screen函数对color stream进行快照,然后在头部坐标周围裁剪图像后,screen1函数将裁剪后的图像上传到云端并调用face++ api for age/gender分类。
我的问题是 screen1 函数需要 3-4 秒来进行分类,这会挂起来自 kinect.I 的连续流式传输,我知道我必须使用 asynch/unblocking 调用 screen1 函数但无法确定怎么做。
请指导我解决这个问题。
尝试将 screen1 调用包装在 async
任务中。
示例:
Task screen1Task = Task.Run( () => {
screen1("Kinect789", bmpCropSrc);
});
这将要求您在父方法上声明 async
关键字。如果您不希望它成为 "fire and forget"。
await
screen1Task
更多示例:https://msdn.microsoft.com/en-us/library/hh195051%28v=vs.110%29.aspx