2013-05-04 20 views
0

我有一個按鈕命名爲bExecute和它的Click事件處理程序有此體:metro應用UI ProgressRing不更新和UI掛起

try 
{ 
    // Activate the progress ring 
    prProgress.Visibility = Visibility.Visible; 
    prProgress.IsActive = true; 
    bExecute.IsEnabled = false; 

    // Some Task 
    DoTask(); 
} 
catch(Exception ex) 
{ 
    // Do Something 
} 
finally 
{ 
    // Stop the progress ring 
    prProgress.Visibility = Visibility.Collapsed; 
    prProgress.IsActive = false; 
    bExecute.IsEnabled = true; 
} 

這種方法有以下問題:

  • UI似乎掛起直到任務完成,然後按照 恢復正常。
  • ProgressRing從未出現被激活。
  • bExecute按鈕從未顯示爲啓用/禁用。

我可以在Task.Run()方法包裝DoExecute(),這釋放了UI,但你永遠也看不到ProgressRing和你也不看bExecute被啓用/禁用。

有什麼建議嗎?

回答

1

我猜DoTask()是CPU密集型方法花費很長的時間才能完成。你現在正在做的方式,它在UI線程和塊上執行。您應該按照您的建議將它打包在Task.Run()調用中,但您需要await它,否則事件處理程序的其餘部分將在任務完成之前執行。

嘗試重寫事件處理程序是這樣的:

private async void bExecute_OnClick(object sender, RoutedEventArgs e) 
{ 
    try 
    { 
     // Activate the progress ring 
     prProgress.Visibility = Visibility.Visible; 
     prProgress.IsActive = true; 
     bExecute.IsEnabled = false; 

     // Some Task 
     await Task.Run(() => DoTask()); 
    } 
    catch(Exception ex) 
    { 
     // Do Something 
    } 
    finally 
    { 
     // Stop the progress ring 
     prProgress.Visibility = Visibility.Collapsed; 
     prProgress.IsActive = false; 
     bExecute.IsEnabled = true; 
    } 
} 
+0

完美!我很親密。非常感謝! :) – c0D3l0g1c 2013-05-04 18:56:34

-1

哪個事件處理程序?爲什麼沒有漁獲物? ProgressRing從未出現被激活,因爲finally機構使其摺疊& IsActive = falsebExecute已禁用。所以bExecute按鈕從未顯示爲啓用。方法比你看不到更改要快得多。

try 
{ 
    // Activate the progress ring 
    prProgress.Visibility = Visibility.Visible; 
    prProgress.IsActive = true; 
    bExecute.IsEnabled = false; 

    // Some Task 
    var dispatcher = Windows.UI.Core.CoreWindow.GetForCurrentThread().Dispatcher; 
    dispatcher.RunAsync(DispatcherPriority.Normal,() => DoTask()); 
} 
catch(Exception) 
{ 
} 
finally 
{ 
    // Stop the progress ring 
    prProgress.Visibility = Visibility.Collapsed; 
    prProgress.IsActive = false; 
    bExecute.IsEnabled = true; 
} 
+0

代碼需要ATLEAST 20秒完成。所以我知道這不是問題。 – c0D3l0g1c 2013-05-04 16:46:03

+0

UI線程當前被阻塞,因此強制Dispatcher.RunAsync也無濟於事。是的,我試過了。 – c0D3l0g1c 2013-05-04 16:49:27

+0

你有沒有試過我的代碼? – Xyroid 2013-05-04 16:49:43