0

当我的程序更新其数据库时,我想更改我的启动画面。一切都很好,直到我更改 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 关键字并等待函数时,每个都可以。

请告诉我我的错误在哪里。

4

2 回答 2

1

好的,所以这里发生的是:OnLaunched事件在启动屏幕有机会加载之前完成,因为它是async void. 这意味着调用的方法会OnLaunched触发,然后继续执行而不等待响应。在 Debug 中,调用方法传递的速度OnLaunched可能会延迟,因为调试器必须加载所有模块的符号,使其在您有机会看到它之前成功更改启动画面。不幸的是,您无法将其更改为所需的内容async Task,因为那会 a) 更改方法的签名,因此它不会被覆盖,并且 b) 调用方法可能仍然没有await,所以同样的问题会发生。

这对你意味着什么:你不能awaitOnLaunched. 这意味着要么 a) 你必须await在你的类中做正确的 ing或者同步SplashScreenExtend运行CheckDbVersionand方法(除非你可以'set-and-forget' ,在这种情况下你仍然可以运行它,但你不能它)。ReconstructDatabaseReconstructDatabaseasyncawait

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

于 2013-07-03T23:00:48.530 回答
0

在设置窗口内容以显示启动画面后,您必须激活当前窗口。

SplashScreenExtend extendedSplash = new  SplashScreenExtend(args.SplashScreen, loadState);
Window.Current.Content = extendedSplash;
Window.Current.Activate();
于 2015-11-28T00:56:40.013 回答