使用棱镜命令时,我们应该使用任何“等待/异步”功能吗?

时间:2018-07-27 12:26:05

标签: wpf asynchronous async-await prism

直到今天,我一直在想,当您以DelegateCommand的执行方法绑定到async时,WPF确实是以async的方式做到这一点。

但是根据我得到的一些测试,以及这篇博客文章:http://brianlagunas.com/prism-delegatecommand-fromasynchandler-is-obsolete/从来没有这样。

我们最近开始实现应用程序,并且确实开始使用await / async模式。我们认为这是使用await / async并具有响应式应用程序的好方法。

所以我的问题是:我们可以在命令处理程序中使用(最重要的是,好处)异步/等待吗?

例如:

public class SomeViewModel
{
    public DelegateCommand SomeSpecificCommand { get; set; }
    public SomeViewModel(){
        SomeSpecificCommand = new DelegateCommand(DoSomeWorkAsync);
    }

    private async void DoSomeWorkAsync()
    {
        await DoSomeLongRunningJob();
        //Update the GuiWithSomething
    }
}

从技术上讲,它可以编译,但是:

  1. 我的理解是XAML不会等待异步返回
  2. 如果我使用CompositeCommand,则复合命令不会等待DelegateCommand的结果

1 个答案:

答案 0 :(得分:0)

  

我们可以在命令处理程序中使用(最重要的是,好处)异步/等待吗?

是的,只要您的命令是一劳永逸的。

问题更多的是测试而不是生产:如何使用不知道何时完成的命令测试视图模型?

一种选择是使用内部/公共方法“污染”您的视图模型,这些方法实际上是命令,但是暴露了异步特性,以便您的测试等待它们。

另一种方法是反映到DelegateCommand实例中,以掌握测试中的异步处理程序。

第三,您可以在DelegateCommand的启发下提供自己的命令实现,但可以提供对异步处理程序的(test-)访问。