我有一个名为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;
}
这种方法存在以下问题:
我可以用DoExecute()
方法包裹Task.Run()
,这可以释放用户界面,但是你永远不会看到ProgressRing
,也看不到bExecute
{1}}启用/禁用。
有什么建议吗?
答案 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 = false
和bExecute
已停用。因此,似乎永远不会启用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;
}