Prism模块正在加载锁定调度线程.有办法解决这个问题吗?

本文关键字:解决 问题 模块 加载 锁定 线程 调度 Prism | 更新日期: 2023-09-27 18:17:48

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

问题是我的一个模块加载了一个相当大的第三方库。我最初让这个模块注册它所有的类型,并把实际的分辨率留给Unity。然而,这带来了两个问题:1)当用户到达加载该模块中的视图时,应用程序将在加载这个大库时暂停。2)在用户与视图交互之前,该模块中的一些业务逻辑应该是激活的。所以在我的IModule实现而不是调用RegisterType()为我的大多数服务,我调用RegisterInstance。这一切都很好。

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

是否有一些我可以做的事情有这个缓慢加载模块异步加载或类似,以便进度条动画?如果这是不可能的,那也不是世界末日,但如果有。

Prism模块正在加载锁定调度线程.有办法解决这个问题吗?

您(至少)有两个选择:

  • 使用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),并且这些服务会表现得很奇怪。如果发生这种情况,在启动执行初始化的任务之前解决它们。