Metro App UI ProgressRing不会更新,UI也会挂起

时间:2013-05-04 16:32:34

标签: c#-4.0 microsoft-metro winrt-xaml

我有一个名为bExecute的按钮,它的Click事件处理程序有这个主体:

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

这种方法存在以下问题:

  • 用户界面似乎挂起,直到任务完成,然后按照 正常。
  • ProgressRing似乎永远不会被激活。
  • bExecute按钮似乎永远不会启用/禁用。

我可以用DoExecute()方法包裹Task.Run(),这可以释放用户界面,但是你永远不会看到ProgressRing,也看不到bExecute {1}}启用/禁用。

有什么建议吗?

2 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:-1)

哪个事件处理程序?为什么没有捕捉身体?永远不会激活ProgressRing,因为finally正文使其崩溃& IsActive = falsebExecute已停用。因此,似乎永远不会启用bExecute按钮。 DoTask方法比无法看到更改的速度快得多。

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