在后台使用非托管库时无法更新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