Caliburn Micro Window Manager,'调用线程无法访问此对象,因为另一个线程拥有它'

时间:2017-01-23 15:28:59

标签: c# wpf multithreading caliburn.micro

在我的WPF包括Caliburn.Micro应用程序中,我想向用户显示一个新窗口。这适用于所有窗户,但一个。它引发了一个异常陈述

  

调用线程无法访问此对象,因为另一个线程拥有它。

这就是我调用Window Manager的方式

WindowManager.ShowWindow(new DatabaseCredentialsViewModel(EventAggregator, WindowManager,
                    SettingsManager));

此外,我还试图通过new WindowManager().ShowWindow(...);“创建一个新的窗口管理器”。但是,上述工作都没有。有什么不同于其他窗户?

我在OnViewLoaded的后台开始了一个新线程,我想从中展示一个新窗口。我首先开始一个新线程的原因是默认情况下,GUI线程是主线程,因此,如果我不启动新线程,则在执行代码之前GUI不会正确加载(等等。)

编辑I:我调查了问题并发现它不是窗口管理器导致此时出现问题,但可能是new DatabaseCredentialsViewModel,因为我创建了一个全新的窗口管理器(原始的一个新实例)类),它仍然会抛出相同的错误。

编辑II:我试过这个。但是,确切的错误仍然存​​在。

Dispatcher.CurrentDispatcher.BeginInvoke((Action) (() =>
            {
                WindowManager.ShowWindow(new DatabaseCredentialsViewModel(EventAggregator, WindowManager, SettingsManager));
            }));

1 个答案:

答案 0 :(得分:0)

WPF应用程序是单线程应用程序,您无法直接从另一个线程修改GUI元素。您可以使用Dispatcher进行此操作(Google Dispatcher.BeginInvoke,或查看enter image description here),或BackgroundWorker,或者最好使用async/await(请参阅example )。