如何在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