棱镜模块加​​载锁定调度程序线程。 有没有解决的办法?

Prism应用程序我执行多个启动任务可能需要一段时间,如果其中一些任务无法正确执行,它将使应用程序在function上无法使用。 因此,我有一个在Shell之前显示的启动屏幕,并显示每个启动任务的状态日志。 (启动任务由模块中的共享服务处理。)屏幕包含一个将IsIndeterminate设置为True的ProgressBar(至少在启动任务运行时)。 我还在启动任务中包含了在显示日志中显示模块本身的初始化。 (日志中的第一项任务。)

我遇到的问题是我的一个模块加载了一个相当大的第三方库。 我最初有这个模块只是记录它的所有类型并将实际分辨率留给Unity。 但是,这提出了两个问题:1)当用户到达加载此模块中的视图的点时,应用程序将在加载此大型库时暂停。 2)在用户与视图交互之前,此模块中的某些业务逻辑应处于活动状态。 所以在我的IModule实现中,而不是为我的大多数服务调用RegisterType(),我正在调用RegisterInstance。 这一切都很好。

问题是,现在当Unity在这个模块中创建所有服务时,这个第三方库正在预先加载,我的模块初始化需要一段时间才能完成。 我的启动屏幕中的进度条没有动画,因为Dispatcher线程似乎被占用加载模块。

我可以做些什么来让这个缓慢加载模块异步加载或类似,以便进度条动画? 如果不可能的话,这不是世界的尽头,但拥有它会很好。

你有(至少)两个选择:

  • 使用SplashScreen
  • 在另一个线程上进行模块初始化

Splashscreen示例:

 internal class MyBootstrapper { // [...] protected override void InitializeModules() { var splashScreen = new SplashScreen( "myLogo.png" ); splashScreen.Show( false ); try { base.InitializeModules(); } finally { splashScreen.Close( TimeSpan.Zero ); } } } 

任务示例:

 internal class MyBootstrapper { // [...] protected override void InitializeModules() { Task.Run( () => base.InitializeModules() ); } } 

有了这个,你必须要小心,在ui线程上可能会意外地没有创建某些服务(例如EventAggregator ),而且这些服务会表现EventAggregator奇怪。 如果发生这种情况,请在开始执行初始化的任务之前解决它们。