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

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

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

问题是,现在当Unity在此模块中创建所有服务时,该第三方库已被预先加载,我的模块初始化需要一段时间.而且启动屏幕上的进度条没有动画,因为Dispatcher线程似乎在加载模块时被占用.

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

最佳答案
您(至少)有两个选择:

>使用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),而这些服务的行为会很奇怪.如果发生这种情况,请在启动初始化任务之前解决它们.

转载注明原文:棱镜模块加​​载锁定调度程序线程.有没有解决的办法? - 代码日志