0

我有一个名为的按钮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;
}

这种方法存在以下问题:

  • UI似乎挂起,直到任务完成,然后正常恢复。
  • ProgressRing 似乎从未被激活。
  • bExecute 按钮似乎从未启用/禁用。

我可以包装DoExecute()一个Task.Run()方法,这可以释放UI,但是你永远看不到ProgressRing,也看不到bExecute被启用/禁用。

有什么建议么?

4

2 回答 2

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;
    }
}
于 2013-05-04T18:39:10.097 回答
-1

哪个事件处理程序?为什么没有捕捉体?ProgressRing似乎从未被激活,因为finallybody 使其折叠IsActive = falsebExecute禁用。所以bExecuteButton 似乎永远不会被启用。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;
}
于 2013-05-04T16:44:47.037 回答