【发布时间】:2019-02-26 15:32:07
【问题描述】:
我想使用 DirectShow 在 Windows 上拍摄网络摄像头快照。这些快照将被保存到磁盘,而不显示这些图像。我想启动每秒拍摄一次快照的快照进程,直到我停止它,而主进程继续。
所以我选择 Yet Another Web Camera Control 让 DirectShow 与 C# 一起使用,并且演示工作正常。
但是当我在自己的任务中使用包装器时遇到问题,出现典型的线程错误The calling thread cannot access this object because a different thread owns it.
调用代码如下:
Task.Run(() =>
{
using (var cam1 = new SnapshotCam(camList.First(), "person", webCameraControl))
{
// Act
Bitmap image = null;
if (!cam1._wcc.IsCapturing)
{
cam1._wcc.StartCapture(cam1._cameraId);
Task.Delay(500).Wait();
}
image = cam1._wcc.GetCurrentImage();
// Assert
Assert.NotNull(image);
}
}).Wait();
我难以处理的对象是存储在cam1._wcc 中的webCameraControl:该对象继承自System.Windows.Controls.UserControl,可以附加到UI。但就我而言,我没有任何 UI,必须以“无头”样式拍摄快照。
所以当我想使用_wcc-object 时,麻烦就开始了。我已经尝试为相应的线程调用_wcc.Dispatcher,但没有成功。
如何在独立于其余代码的自己的任务/线程中调用上面的代码?
【问题讨论】:
-
从错误中可以清楚地看出,让多个线程与其对象交互并不快乐。可能它只需要您确保一个线程创建、交互和销毁每个对象。它可能需要一个线程来与它的任何 个对象进行交互。它甚至可能期望在 COM“STA”上下文中运行(单线程,消息泵在空闲时运行)。
标签: c# directshow