2016-05-13 57 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

如果你想從另一個線程打開一個新窗口,你需要調用Current調度器。

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)); 

        }); 
       }   
     }