我在尝试使用Emgu从网络摄像头捕获图像时遇到了问题。要执行此任务,Emgu使用非托管opencv库。所以问题是我无法从System.Timers.Timer Elapsed事件更新我的GUI(WPF图像控件)。我知道它在不同的线程中运行,但是,嘿,这就是我使用Dispatcher的原因。这是我第一次无法使用Dispatcher。获取InvalidOperationException“调用线程无法访问此对象,因为另一个线程拥有它。”。我花了一整天时间寻找解决方案,但仍无法解决问题。任何想法为什么会发生?
webcam.OnNewFrame += newBitmapSource => this.imgCaptured.Dispatcher.Invoke
(
new Action(delegate
{
this.imgCaptured.Source = newBitmapSource;
}),
DispatcherPriority.Background
);
Stack Trace的最后一件事是:System.Windows.Threading.Dispatcher.VerifyAccess()
但是,如果我调用Dispatcher.CheckAccess(),则返回true。
更新:
最后我自己发现了:必须在UI Thread上创建BitmapSource。似乎它不能使用这个对象。
答案 0 :(得分:1)
您是否尝试将其设置为非后台线程。我想知道这是否是一个问题 - 从后台线程更新UI。
此外,它说你必须在尝试跨不同的线程 - 工作线程和UI线程共享它们之前冻结Bitmap资源。请参阅以下链接。
WPF Dispatcher {"The calling thread cannot access this object because a different thread owns it."}
http://social.msdn.microsoft.com/Forums/en-US/windowswic/thread/9223743a-e9ae-4301-b8a4-96dc2335b686