我一直在使用Prism 4.1并且有许多类使用IEventAggregator
和ThreadOption.UIThread
选项订阅事件(通常在他们的构造函数中)。
我现在升级到Prism 6但是当我运行我的应用程序时,它会在一个带有InvalidOperationException的行上掉线。消息是:
要使用UIThread选项进行订阅,必须在UI线程上构造EventAggregator
调用堆栈显示我的DI容器(Castle Windsor)正在解析有问题的类,因此它不在UI线程上。然而,这一切都与Prism 4.1一起工作得很好,所以它改变了什么?
答案 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