我想在程序更新数据库时更改启动屏幕。在我更改OnLunch事件处理程序之前,一切都很好。根据某些条件,我必须使用async
关键字。
protected override async void OnLaunched(LaunchActivatedEventArgs args)
{
bool IsAppUpdated = await CheckDbVersion();
if(IsAppUpdated)
{
if (args.PreviousExecutionState != ApplicationExecutionState.Running)
{
bool loadState = (args.PreviousExecutionState == ApplicationExecutionState.Terminated);
SplashScreenExtend extendedSplash = new SplashScreenExtend(args.SplashScreen, loadState);
Window.Current.Content = extendedSplash;
}
bool fine = await ReconstructDatabase();
}
//doing sth else
}
问题是当我运行程序时,新的启动屏幕不会出现。但当我调试代码时,会出现启动屏幕。此外,当我删除async关键字并等待函数时,每个函数都可以。
请告诉我我的错误在哪里。
好的,这里发生的是:OnLaunched
事件在启动屏幕有机会加载之前就完成了,因为它是async void
。这意味着调用OnLaunched
的方法会激发,然后继续,而不等待响应。在Debug中,调用方法通过OnLaunched
的速度可能会延迟,因为调试器必须加载所有模块的符号,使其在您有机会看到它之前成功地更改了启动屏幕。不幸的是,您无法将其更改为所需的async Task
,因为这将a)更改方法的签名,这样它就不会被重写,b)调用方法可能仍然没有await
它,所以同样的问题也会发生。
这对您意味着:您不能在OnLaunched
中使用await
方法。这意味着a)您必须在SplashScreenExtend
类中执行正确的await
ing,或者同步运行CheckDbVersion
和ReconstructDatabase
方法(除非您可以"设置并忘记"ReconstructDatabase
,在这种情况下,您仍然可以运行它async
,但不能运行await
)。
希望这对编码有帮助和快乐。
设置窗口内容以显示splashscreen后,必须激活当前窗口。
SplashScreenExtend extendedSplash = new SplashScreenExtend(args.SplashScreen, loadState);
Window.Current.Content = extendedSplash;
Window.Current.Activate();