2016-05-06 15 views
2

予想通りに動作しないコードパスがあります。おそらくバグがあるかもしれませんが、誤解している作業を待っている可能性が高いと思われます。次のコードの目的は、2番目の画面に移動し、その後、タイムアウトに基づいて、再び移動し、いくつかのコンテンツを共有しようとすることです:期待通りに動作しないタスクを待つ

public void DisplayAdvert(BaseViewModel sourceVM, Task afterAdvert) 
    {       
     _afterShow = afterAdvert; 
     _tmr = new DispatcherTimer(); 
     _tmr.Tick += _tmr_Tick; 
     _tmr.Interval = new TimeSpan(0, 0, 2); 
     _tmr.Start(); 

     Navigation.Navigate<AdvertViewModel>(); 
    } 

AdvertHelper adHelper = new AdvertHelper(); 

Task nav = new Task(async() => 
{ 
    await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async() => 
    { 
     System.Diagnostics.Debug.WriteLine("Call Navigate to MainPageViewModel"); 
     Navigation.Navigate<MainPageViewModel>(); 

     saved = await SaveVideo(); 
     System.Diagnostics.Debug.WriteLine("After SaveVideo()"); 
    }); 
}); 
adHelper.DisplayAdvert(this, nav); 

System.Diagnostics.Debug.WriteLine($"Before await nav (saved: {saved})"); 
await nav; 
System.Diagnostics.Debug.WriteLine($"After await nav (saved: {saved})"); 

DisplayAdvertは次のようになりますタイムアウト:

private void _tmr_Tick(object sender, object e) 
    {    
     _afterShow.Start(); 
     _tmr.Stop(); 
    } 

だから、私の理解では、私はその後、目的のOのために(動画を保存しようとすると、MainPageViewModelにナビゲートしますタスクを作成していることですこれは、数秒後にSaveVideo()が単に非同期関数でtrueを返すと仮定します。デバッグから

:だから

Before await nav (saved: False) 
Call Navigate to MainPageViewModel 
SaveVideo() Called 
After await nav (saved: False) 
SaveVideo() Return true 
After SaveVideo() 

、私はこれを正しく読んでいる場合、コードはタスクnav(したがってSaveVide())を待っているのではなく、継続的なので、結果を取得していません正しい時刻にSaveVideo()を呼び出します。

+0

3つのコードがあります。それらの少なくとも1つは、奇妙な根本にあります。意味、あなたがこれを少し単純化できるかどうかを見てください。 –

答えて

4

あなたが見ているコアの問題は、Taskコンストラクタがasync代理人を理解していないことです。 You should never, ever use the Task constructor; as I describe on my blog, there are no use cases for it. Ever.

次のコードの目的は、このような何かなぜない2番目の画面に移動し、その後、タイムアウトに基づいて、再び移動して、いくつかのコンテンツ

を共有しようとするのですか?

Navigation.Navigate<AdvertViewModel>(); 
await Task.Delay(2); 
Navigation.Navigate<MainPageViewModel>(); 
saved = await SaveVideo(); 
関連する問題