2013-06-26 51 views
0

我想在程序更新其數據庫時更改我的啓動畫面。一切都很好,直到我改變OnLunch事件處理程序。我必須根據一些條件使用async關鍵字。更改SplashScreen當OnLunch方法具有異步關鍵字

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 

} 

問題是當我運行程序時,新的splash-screen沒有出現。但是當我調試代碼時,會出現啓動畫面。此外,當我刪除異步關鍵字,並等待功能,每一個成爲確定。

請指教我,我的錯誤在哪裏。

+0

MSDN具有專用於本主題[這裏](https://msdn.microsoft.com/en-us/library/windows/apps/xaml/Hh868191(V = win.10)的.aspx的製品)。 –

回答

1

好的,所以這裏發生的是:OnLaunched事件在啓動畫面有機會加載之前完成,因爲它是async void。這意味着調用OnLaunched觸發的方法,然後繼續而不等待響應。在調試中,調用方法通過OnLaunched的速度很可能會延遲,因爲調試器必須加載所有模塊的符號,從而在您有機會看到它之前成功更改啓動畫面。不幸的是,你不能將它改變爲它所需要的,async Task,因爲那樣會a)改變方法的簽名,所以它不會被覆蓋,b)調用方法可能仍然不是await它,所以同樣的問題會發生。

這對您意味着什麼:您不能在OnLaunched中使用await方法。這意味着要麼a)您必須在SplashScreenExtend類中執行正確的await或者同步運行CheckDbVersionReconstructDatabase方法(除非您可以'設置並忘記'ReconstructDatabase,在這種情況下,您仍然可以運行它async,但你只是不能await它)。

希望這有助於和快樂的編碼。

+0

「你無法等待OnLaunched中的方法」......爲什麼不呢? –

0

設置窗口內容以顯示啓動畫面後,必須激活當前窗口。

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