我的应用程序中有一个页面显示,我想执行一个可能长时间运行的后台操作。虽然此操作正在进行中,但应提供另一种视图,一旦完成,应将该区域导航回其以前的视图。如果出现任何问题,导航应该转到其他视图。
为了说明这一点,假设我有一些类,并在其构造函数中设置ICommand:
SomeAction = new DelegateCommand(() =>
{
_regionManager.RequestNavigate("MyTarget", nameof(SomeProgressPage));
Task.Run(() =>
{
DoSomeWork();
});
});
任务本身关注的是可能长期存在的事情;完成后,它应导航到条件目的地。
private void SomeWork()
{
try
{
// Do Work
// ...
// Return when done.
_regionManager.RequestNavigate("MyTarget", nameof(SomePage));
}
catch
{
_regionManager.RequestNavigate("MyTarget", nameof(SomeErrorPage));
}
}
虽然我可以在调试中逐步完成此操作,并且在途中没有遇到任何错误,但是当从另一个线程调用时,RequestNavigation似乎没有任何影响,也没有抛出异常。我导航到'SomeProgressPage',任务确实运行,并根据其结果,执行可以遵循RequestNavigation - 然后什么都没有。
我还尝试通过事件执行此导航,例如:
eventAggregator.GetEvent<NavigationRequestEvent>().Subscribe(x =>
{
regionManager.RequestNavigate(x.Target, x.Destination, x.Parameters);
}, ThreadOption.UIThread);
在这种情况下,发布事件时甚至不会调用订阅者。
我从谷歌搜索中找不到任何可靠的资源来处理这个问题,而且没有通过Prism连接源和调试;在使用Prism时,如何最好地实现这种功能?
答案 0 :(得分:2)
如果要从另一个线程打开一个新窗口,则需要调用当前调度程序。
private void SomeWork()
{
try
{
// Do Work
// ...
// Return when done.
App.Current.Dispatcher.Invoke((Action)delegate
{
_regionManager.RequestNavigate("MyTarget", nameof(SomePage));
});
}
catch
{
App.Current.Dispatcher.Invoke((Action)delegate
{
_regionManager.RequestNavigate("MyTarget", nameof(SomeErrorPage));
});
}
}
答案 1 :(得分:1)
事情是,任务AggregatedException处理程序吞下了未等待的任务中抛出的异常。您可以通过检查Task.Exception属性来访问任务抛出的异常。您还可以执行以下操作:
select c.id, (select max(pp.id) from ClientPolicy pp ... c.lastName like '%'
第二个ContinueWith仅在任务出现故障时启动(意味着任务已抛出异常)。