当OnLunch方法具有async关键字时更改SplashScreen



我想在程序更新数据库时更改启动屏幕。在我更改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类中执行正确的awaiting,或者同步运行CheckDbVersionReconstructDatabase方法(除非您可以"设置并忘记"ReconstructDatabase,在这种情况下,您仍然可以运行它async,但不能运行await)。

希望这对编码有帮助和快乐。

设置窗口内容以显示splashscreen后,必须激活当前窗口。

SplashScreenExtend extendedSplash = new  SplashScreenExtend(args.SplashScreen, loadState);
Window.Current.Content = extendedSplash;
Window.Current.Activate();

最新更新