2016-05-13 13 views
0

アプリケーションに表示されているページがあり、バックグラウンドで長時間動作する可能性があります。この操作が進行中であれば、別のビューを提示し、完了したらその領域を元のビューに戻す必要があります。何かがうまくいかない場合、ナビゲーションは別のビューに移動する必要があります。バックグラウンド操作からナビゲート

これを説明するために、私はいくつかのクラスを持っていると仮定し、そのコンストラクタでのICommandを設定します。

SomeAction = new DelegateCommand(() => 
{ 
    _regionManager.RequestNavigate("MyTarget", nameof(SomeProgressPage)); 

    Task.Run(() => 
    { 
     DoSomeWork(); 
    }); 
}); 

タスク自体が何か長時間実行する可能性を懸念しています。完了すると、条件付きの目的地にナビゲートする必要があります。

private void SomeWork() 
{ 
    try 
    { 
     // Do Work 
     // ... 

     // Return when done. 
     _regionManager.RequestNavigate("MyTarget", nameof(SomePage)); 
    } 
    catch 
    { 
     _regionManager.RequestNavigate("MyTarget", nameof(SomeErrorPage)); 
    } 
} 

私がデバッグでこれをステップし、途中で何らかのエラーが発生したことができない一方で、RequestNavigationは別のスレッドから呼び出されたときにどんな効果があるとは思えません。また、例外をスローしません。私は 'SomeProgressPage'にナビゲートし、タスクは実行され、その結果に基づいて、実行はRequestNavigationに続いて、その後は何も実行されません。

私はまた、などのイベントを経て、このナビゲーションを実行しようとしている。この場合

eventAggregator.GetEvent<NavigationRequestEvent>().Subscribe(x => 
{ 
    regionManager.RequestNavigate(x.Target, x.Destination, x.Parameters); 

}, ThreadOption.UIThread); 

イベントが公開されたときに、加入者であっても呼び出されません。

私はグーグル・グーグルでこれに対処するための信頼できるリソースを見つけることができず、ソースへの接続とPrismによるデバッグは不十分です。どのようにこの種の機能は、プリズムを使用しながら最高の実装される必要がありますか?

答えて

1

待っていないタスクでスローされた例外は、タスクAggregatedExceptionハンドラによって飲み込まれることがあります。 Task.Exceptionプロパティをチェックすることによって、タスクによってスローされた例外にアクセスできます。また、次の操作を行うことができます

 Task.Run(() => 
     { 
      //DoSomeWork(); 
     }) 
     .ContinueWith((t) => 
     { 
      // Return when done. 
      _regionManager.RequestNavigate("MyTarget", nameof(SomePage)); 
     }) 
     .ContinueWith((t) => 
     { 
      _regionManager.RequestNavigate("MyTarget", nameof(SomeErrorPage)); 
     }, TaskContinuationOptions.OnlyOnFaulted); 

二ContinueWithのみタスクが(タスクが例外をスローしたことを意味する)フォルトが発生したときlauchedされます。

1

別のスレッドから新しいウィンドウを開く場合は、現在のディスパッチャを呼び出す必要があります。

private void SomeWork() 
      { 
       try 
       { 
        // Do Work 
        // ... 

        // Return when done. 
        App.Current.Dispatcher.Invoke((Action)delegate 
        { 

        _regionManager.RequestNavigate("MyTarget", nameof(SomePage)); 

        }); 
       } 
       catch 
       { 
        App.Current.Dispatcher.Invoke((Action)delegate 
        { 

        _regionManager.RequestNavigate("MyTarget", nameof(SomeErrorPage)); 

        }); 
       }   
     } 
関連する問題