2012-12-06 66 views
0

我試圖讓我的頭腦圍繞着設計一個在長時間運行的任務正在執行時保持響應的用戶界面。Windows應用商店應用用戶界面 - 不響應

爲此,我在VS2012創建了一個簡單的應用程序,並加入以下類到它:

using System.Threading.Tasks; 

namespace TaskTest 
{ 
    class Class1 
    { 
     public async Task<int> Async() 
     { 
      //simulate a long running process 
      for (long x = 0; x < long.MaxValue; x++) { } 
      return 1; 
     } 
    } 
} 

我然後改性正是如此的主網頁的LoadState的()方法:

protected override async void LoadState(Object navigationParameter, Dictionary<String, Object> pageState) 
{ 
    await DoLongRunningProcess(); 
} 

private async Task DoLongRunningProcess() 
{ 
    var id = 0; 
    id = await new Class1().Async(); 
    await new MessageDialog(id + "").ShowAsync(); 
} 

我希望頁面在該進程執行時保持響應。但是,當我運行此代碼時,該頁面需要很長時間才能加載。我究竟做錯了什麼?

TIA

回答

0

這很有幫助。我做了以下修改,我得到了我一直在尋找的結果:

class Class1 
{ 
    public int Launch() 
    { 
     //throw new Exception("Class1 exception"); 
     for (var i = 0; i < int.MaxValue/2; i++) ; 
     return 1; 
    } 
} 

...

protected async override void LoadState(Object navigationParameter, Dictionary<String, Object> pageState) 
{ 
    var task = DoLongRunningProcess(); 
    await task; 
    await new MessageDialog(task.Result + "").ShowAsync(); 
} 

private Task<int> DoLongRunningProcess() 
{ 
    return Task.Run<int>(() => new Class1().Launch()); 
} 

頁面繼續加載,並顯示在消息對話框短暫的停頓之後。但是,現在我需要知道如何捕捉異常。如果我取消註釋//在方法Launch()中拋出新的Exception ...行,則會將其報告爲未處理的異常。我想在主UI線程(即方法LoadState的主體)中捕獲這個異常,但似乎無法管理它。