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

时间:2016-11-14 19:52:05

标签: c# wpf unity-container prism

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

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

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

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

1 个答案:

答案 0 :(得分:1)

你有(至少)两个选择:

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