Prism事件聚合器 - ThreadOption.UIThread在v4中工作但不在v6中工作

时间:2018-03-13 16:21:44

标签: prism prism-6

我一直在使用Prism 4.1并且有许多类使用IEventAggregatorThreadOption.UIThread选项订阅事件(通常在他们的构造函数中)。

我现在升级到Prism 6但是当我运行我的应用程序时,它会在一个带有InvalidOperationException的行上掉线。消息是:

  

要使用UIThread选项进行订阅,必须在UI线程上构造EventAggregator

调用堆栈显示我的DI容器(Castle Windsor)正在解析有问题的类,因此它不在UI线程上。然而,这一切都与Prism 4.1一起工作得很好,所以它改变了什么?

2 个答案:

答案 0 :(得分:0)

我怀疑它之前是否有效?"订阅者是在 ui 线程"上运行的,而是在随机线程上运行EventAggregator是创建于。在较旧版本的棱镜中,它只是没有关心(并且ThreadOption.UIThread在某种程度上撒谎。

我不太了解Castle Windsor,但仅仅因为DI框架解决并不意味着在不同的线程上创建。为了安全起见,请在引导过滤器中的EventAggregator中解析InitializeModules一次,以便在ui线程上创建它。

使用Unity,它看起来像这样:

internal class Bootstrapper : UnityBootstrapper
{
    protected override void InitializeModules()
    {
        Container.Resolve<IEventAggregator>();

        base.InitializeModules();
    }
}

答案 1 :(得分:0)

事实证明这取决于我的应用程序启动方式。我使用的是“主要”入口点样式,但我需要将其移至App.xaml OnStartup()而不是:

Prism EventAggregator Exception - must be constructed on the UI thread