Prism应用程序我执行了多个启动任务,可能需要一段时间,如果其中一些任务无法正常执行,它将使应用程序在功能上无法使用。因此,我有一个在Shell之前显示的启动屏幕,并显示每个启动任务的状态日志。 (启动任务由模块中的共享服务处理。)屏幕包含一个将IsIndeterminate设置为True的ProgressBar(至少在启动任务运行时)。我还在启动任务中包含了在显示的日志中显示模块本身的初始化。 (日志中的第一项任务。)
我遇到的问题是我的一个模块加载了一个相当大的第三方库。我最初有这个模块只是注册它的所有类型并将实际分辨率留给Unity。但是,这提出了两个问题:1)当用户到达将加载此模块中的视图的点时,应用程序将在加载此大型库时暂停。 2)在用户与视图交互之前,此模块中的某些业务逻辑应处于活动状态。所以在我的IModule实现中,不是为我的大多数服务调用RegisterType(),而是调用RegisterInstance。这一切都很好。
问题是,现在当Unity在这个模块中创建所有服务时,这个第三方库正在预先加载,我的模块初始化需要一段时间才能完成。我的启动屏幕中的进度条没有动画,因为Dispatcher线程似乎被占用了加载模块。
我可以做些什么来让这个缓慢加载模块异步加载或类似,以便进度条动画?如果不可能的话,它不是世界末日,但它很高兴。
答案 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
),这些服务会表现得很奇怪。如果发生这种情况,请在开始执行初始化的任务之前解决它们。