异步事件处理程序 - 来自PointGrey的flycapture

时间:2014-11-17 09:36:20

标签: vb.net async-await flycapture

我正在使用Point Grey的FlyCapture API来驱动一些相机。 在公共课中,我实现了所有启动和初始化代码;在下面的_cam中指的是ManagedGigECamera。 因为我有16个摄像头,所以我希望代码尽可能快,所以我想使用任务。

以下是我使用的代码:


    _cam.StartCapture(AddressOf OnImageGrabbed)

.../...

     Public Sub OnImageGrabbed(ByVal raw_image As ManagedImage)
                Dim t As Task = Task.Run(Sub() 
                                     'save image to disk or whatever
                                         End Sub)
                t.Wait()
     End Sub

以上给出了满意度。通过查看图像时间戳,我可以看到一些图像在被抓取后几秒钟被保存,甚至一些图像被完全跳过...... 我想确保每次调用OnImageGrabbed都会启动一个新任务,然后尝试以下操作,但是它会立即崩溃,并且对象没有设置为对象的实例' (无法真正调试,代码在远程计算机上运行)



    _cam.StartCapture(AddressOf OnImageGrabbed)

.../...

     Public Async Sub OnImageGrabbed(ByVal raw_image As ManagedImage)
                Await Task.Run(Sub() 
                                     'save image to disk or whatever
                                         End Sub)
     End Sub

总而言之,我的问题是:

  • 如何异步运行事件处理程序?
  • 为什么,使用第一个代码,我得到(看起来是什么)每次调用之间的随机延迟 到OnImageGrabbed?我的意思是图像时间戳之间的时间差异永远不会相同,并且从长远来看往往会增加(前几张图像几乎同步,但是大约1分钟后,每张图像会被越来越多的时间分开)。内存泄漏 ? GC?

提前感谢任何暗示!

编辑: 最后,我改变了系统的工作方式:我使用计时器在每个摄像头上触发一个软件触发器,并且每个触发器并行触发':

Parallel.ForEach(Of ListOfCameras)(SingleCamera, 
      Sub(aCamera, loopstate, num)
            aCamera.FireTrigger()
      End Sub)

1 个答案:

答案 0 :(得分:1)

启动任务然后立即阻止它(通过Wait)无需任何操作。您也可以直接运行保存图像代码。

第二个例子实际上是异步的。您可能会收到异常,因为正在处理ManagedImage参数或其子对象之一。请记住,引发事件的代码不知道您的代码是异步的;如果你要异步使用它,你可以从事件参数中复制出你需要的东西。