Wpf 异常:调用线程无法访问此对象,因为其他线程拥有它

Wpf 异常:调用线程无法访问此对象,因为其他线程拥有它,wpf,vb.net,dispatcher,Wpf,Vb.net,Dispatcher,我正在将用户界面从windows窗体转换为WPF。每当我尝试在我创建的这个新WPF窗口上调用任何东西时,我都会遇到以下异常“调用线程无法访问这个对象,因为它是另一个线程拥有的” 我参考了stack overflow和许多网站,发现我应该使用Dispatcher.CheckAccess()或类似于Dispatcher和check access的东西。我试过很多这样的东西 这是我用过的东西之一 Private Delegate Sub ShowSkinInvoked() If (Dispatche

我正在将用户界面从windows窗体转换为WPF。每当我尝试在我创建的这个新WPF窗口上调用任何东西时,我都会遇到以下异常“调用线程无法访问这个对象,因为它是另一个线程拥有的”

我参考了stack overflow和许多网站,发现我应该使用Dispatcher.CheckAccess()或类似于Dispatcher和check access的东西。我试过很多这样的东西

这是我用过的东西之一

Private Delegate Sub ShowSkinInvoked()

If (Dispatcher.CheckAccess()) Then
    Me.Show()
Else
    Dim d As ShowSkinInvoked = New ShowSkinInvoked(AddressOf ShowSkin)
    Dispatcher.Invoke(d)
End If
这已经删除了异常,并且在调试时错误消失了,但是它冻结了应用程序,除了终止它之外,我不能做任何事情。它甚至不在“我,秀”之后显示窗口

另外,如果我编译程序,然后通过指定exe的路径使调用模块使用这个编译的exe,那么出于某种原因,它工作得非常好

如果这听起来令人困惑,那么我的意思是,我有多种形式。如果我调用模块A中的代码来加载和显示模块B,那么它会给我一个异常,但是如果我调用模块A中的代码来运行模块B的已编译exe,那么它运行得很好


有什么建议吗?

当WPF创建一个用户界面时,它会创建一个线程,负责处理所有用户交互事件并安排渲染。这称为调度程序线程。它创建的许多对象都是DispatcherObject的子类

不能从创建DispatcherObject的Dispatcher线程以外的其他线程调用DispatcherObject上的方法。原因很复杂,但与COM互操作有关

在调度程序线程上运行的按钮单击事件中

如果您来自另一个线程,则必须在dispatcher线程上执行您的工作。除非创建多个调度程序线程,否则通常可以通过访问静态当前调度程序
dispatcher.CurrentDispatcher
找到它


不过,我建议您解释一下您的问题,即您试图在一个窗体上显示另一个ui的工作。有多种方式(如EventAggregator)在ui之间进行通信,这可能更合适

有一个应用程序是在windows窗体中制作的,运行得非常好。我在WPF中重新创建了相同的东西,它也使用了完全相同的代码(除了少数语法重命名以适应WPF)。我在这个WPF窗口中得到了异常,但它从未出现在windows窗体中。此外,我还尝试使用Dispatcher.CurrentDispatcher。我仍然得到同样的例外。对我来说有趣的是,如果我将应用程序编译成一个exe,然后运行这个新的exe,它就可以完美地工作。它只在代码中出现这些错误。基本上,有一个主应用程序调用多个其他应用程序/类库。我转换为WPF的应用程序类似于所有指纹和掌纹的扫描仪。当用户单击指纹扫描时,会调用此命令,扫描应用程序的整个UI应加载并显示应扫描的手指。手指和相关事物的顺序由类库控制,而不是由扫描应用程序控制。我认为这就是导致问题的原因,但这在旧的windows窗体版本的应用程序中从未发生过。将应用程序从一个GUI框架移植到另一个GUI框架是一项困难的任务。多个可执行文件的原因是什么?您可以让多个应用程序与wpf通信,但我认为可能有一种更容易实现业务目标的方法。