2013-06-26 3 views
0

내 프로그램에서 데이터베이스를 업데이트 할 때 시작 화면을 변경하고 싶습니다. 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 

} 

문제는 내가 프로그램을 실행할 때 새로운 시작 화면이 나타나지 않는다는 것입니다. 하지만 코드를 디버깅 할 때 스플래시 화면이 나타납니다. 또한, 비동기 키워드를 제거하고 기능을 기다릴 때마다 ok가됩니다.

제발 제 실수는 어디입니까?

+0

MSDN이 항목 [여기 (https://msdn.microsoft.com/en-us/library/windows/apps/xaml/Hh868191 (V = win.10) .ASPX 전용 물품을 보유). –

답변

1

그래, 여기에 무슨 일이 발생합니까? async void이기 때문에 시작 화면이로드되기 전에 OnLaunched 이벤트가 완료됩니다. 즉, OnLaunched을 호출하는 메서드가 실행 된 다음 응답을 기다리지 않고 계속됩니다. 디버그에서 호출 메서드가 OnLaunched을 넘는 속도는 디버거가 모든 모듈에 대한 심볼을로드해야하기 때문에 지연 될 가능성이 높습니다. 따라서 디버거가 모든 모듈에 심볼을로드해야 볼 가능성이 있기 전에 성공적으로 스플래시 화면을 변경할 수 있습니다. 불행히도, 당신은 그것을 바꿀 필요가 없도록 async Task으로 변경할 수 없습니다. a) 메소드의 서명을 변경하여 오버라이드되지 않도록하고, b) 호출하는 메소드가 여전히 await이 아니기 때문에 변경해야합니다. 같은 문제가 발생합니다.

당신이 의미하는 바는 await 개의 방법은 OnLaunched 수 없습니다. 즉, SplashScreenExtend 클래스에서 적절한 await 클래스를 수행하거나 CheckDbVersionReconstructDatabase 메서드를 동 기적으로 실행해야합니다. (설정하지 않고 '설정하고 잊어 버릴'수있는 경우가 아니면 async을 계속 실행할 수있는 경우 ReconstructDatabase) 그러나 당신은 단지 await 그것 일 수 없다).

희망이 있으면 도움이됩니다.

+0

"OnLaunched에서 메서드를 기다릴 수 없습니다."... 왜 안 되니? –

0

스플래시 화면을 표시하도록 창 콘텐츠를 설정 한 후에 현재 창을 활성화해야합니다.

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