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

时间:2011-04-18 14:07:54

标签: c# wpf multithreading dll unmanaged

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

1 个答案:

答案 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