在后台使用非托管库时无法更新WPF GUI

尝试使用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。 似乎它不能使用此对象。

您是否尝试将其设置为非后台线程。 我想知道这是否是一个问题 – 从后台线程更新UI。

此外,它说你必须先冻结Bitmap资源,然后再尝试在不同的线程 – 工作线程和UI线程之间共享它们。 请参阅以下链接。

WPF Dispatcher {“调用线程无法访问此对象,因为另一个线程拥有它。”}

http://social.msdn.microsoft.com/Forums/en-US/windowswic/thread/9223743a-e9ae-4301-b8a4-96dc2335b686