我正在使用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
总而言之,我的问题是:
提前感谢任何暗示!
编辑: 最后,我改变了系统的工作方式:我使用计时器在每个摄像头上触发一个软件触发器,并且每个触发器并行触发':
Parallel.ForEach(Of ListOfCameras)(SingleCamera,
Sub(aCamera, loopstate, num)
aCamera.FireTrigger()
End Sub)
答案 0 :(得分:1)
启动任务然后立即阻止它(通过Wait
)无需任何操作。您也可以直接运行保存图像代码。
第二个例子实际上是异步的。您可能会收到异常,因为正在处理ManagedImage
参数或其子对象之一。请记住,引发事件的代码不知道您的代码是异步的;如果你要异步使用它,你可以从事件参数中复制出你需要的东西。