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

标签 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。

更新:

最后我自己发现了:BitmapSource 必须在 UI Thread 上创建。似乎它不能以其他方式使用此对象。

最佳答案

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

另外,它说您必须先卡住位图资源,然后才能尝试在不同线程(工作线程和 UI 线程)之间共享它们。请参阅以下链接。

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

关于c# - 在后台使用非托管库时无法更新 WPF GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5704080/

相关文章:

.net - 与 RowDetails 一起使用时,WPF DataGrid 的高度错误

wpf - 如何在 WPF 中对 DataGrid 列标题进行分组

c# - WPF TextBlock 文本绑定(bind)

Java单进程多线程

c# - 将pdf页面转换成1000张以上的图片

C# 我是否正确使用锁?

javascript - 在 Unity 中使用的最佳容器容器是什么?

c# - 将部分 viewModel 发布到发布操作方法

c# - 同时包含 "application/xml"和 "text/xml"ContentTypes 的 WCF 绑定(bind) SOAP 1.1 请求

java - 将 Java 套接字从线程 A 传递到 B