在后台使用非托管库时无法更新WPF GUI
本文关键字:更新 GUI WPF 后台 | 更新日期: 2023-09-27 17:50:41
我在尝试使用Emgu从网络摄像头捕获图像时遇到了一个问题。为了完成这项任务,Emgu使用非托管的openv库。所以问题是我不能从System.Timers.Timer Elapsed事件更新我的GUI (WPF图像控件)。我知道它在不同的线程中运行,但这就是我使用Dispatcher的原因。这是我第一次不能用调度员。获取InvalidOperationException,提示"调用线程无法访问该对象,因为它属于另一个线程"。我花了一整天的时间寻找解决办法,但还是没能修好它。知道为什么会这样吗?
webcam.OnNewFrame += newBitmapSource => this.imgCaptured.Dispatcher.Invoke
(
new Action(delegate
{
this.imgCaptured.Source = newBitmapSource;
}),
DispatcherPriority.Background
);
堆栈跟踪的最后一件事是:System.Windows.Threading.Dispatcher.VerifyAccess()
但是,如果我调用Dispatcher.CheckAccess(),它返回true。
更新:最后我自己发现了:BitmapSource必须在UI线程上创建。
您是否尝试将其设置为非后台线程?我想知道这是不是一个问题-从后台线程更新UI。
也,它说你必须冻结位图资源之前,试图在不同的线程之间共享它们-工作线程和UI线程。参考以下链接。
WPF Dispatcher {"调用线程无法访问该对象,因为它属于另一个线程。"}
http://social.msdn.microsoft.com/forums/en us/windowswic/thread/9223743a e9ae - 4301 b8a4 - 96 dc2335b686