从后台操作导航

时间:2016-05-13 11:07:03

标签: c# wpf prism

我的应用程序中有一个页面显示,我想执行一个可能长时间运行的后台操作。虽然此操作正在进行中,但应提供另一种视图,一旦完成,应将该区域导航回其以前的视图。如果出现任何问题,导航应该转到其他视图。

为了说明这一点,假设我有一些类,并在其构造函数中设置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时,如何最好地实现这种功能?

2 个答案:

答案 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仅在任务出现故障时启动(意味着任务已抛出异常)。