C# 如何调用AsyncRelayCommand

C# 如何调用AsyncRelayCommand,c#,mvvm,lambda,async-await,C#,Mvvm,Lambda,Async Await,我有一个使用VS2015创建的WPF MVVM应用程序 我一直在使用“RelayCommand”类将命令调用从xaml连接到视图模型。这很有效,但现在我有一个按钮点击,触发了一个需要很长时间的过程。我希望使其异步,以便UI保持响应 我已经更新了视图模型方法,使其成为异步的,并且所有下游调用都是异步的。这在我的单元测试中运行良好,我还更新了单元测试以进行异步重新请求 我发现了一个AsyncRelayCommand类,该类实现ICommand并具有以下构造函数: public AsyncRelayC

我有一个使用VS2015创建的WPF MVVM应用程序

我一直在使用“RelayCommand”类将命令调用从xaml连接到视图模型。这很有效,但现在我有一个按钮点击,触发了一个需要很长时间的过程。我希望使其异步,以便UI保持响应

我已经更新了视图模型方法,使其成为异步的,并且所有下游调用都是异步的。这在我的单元测试中运行良好,我还更新了单元测试以进行异步重新请求

我发现了一个AsyncRelayCommand类,该类实现ICommand并具有以下构造函数:

public AsyncRelayCommand(Func<object, Task> execute, Func<object, bool> canExecute = null)
    {
        this.execute = execute;
        this.canExecute = canExecute ?? (o => true);
    }
这将在“OnCompareAsync”下显示红色sqiggly,其中有3个错误,包括:

无法将方法组“OnCompareAsync”转换为非委托类型“Task”。您是否打算调用该方法

如何使用此构造函数?

尝试以下方法:

CompareCommand = new AsyncRelayCommand(async (o) => await OnCompareAsync());

我添加了Crowcoder建议的MyToolkit nuget包。然后,我能够获得一个带有“CompareCommand=newAsyncRelayCommand(OnCompareAsync);”的编译。

您使用的是哪个
AsyncRelayCommand
?因为有一个例子。顺便说一句,您在那里做的是将一个(几乎可以肯定)不完整的
任务传递给构造函数,因为这就是
Task.Run()所做的
返回。这会导致错误:1)无法将类型“void”隐式转换为“System.Threading.Tasks.Task”2)无法将lambda表达式转换为预期的委托类型,因为块中的某些返回类型无法隐式转换为委托返回type@RobBowman更新。我假设您有“public async Task oncomparasync(){…}”,lambda的目的是添加一个在oncomparasync中不需要/没有的“object”参数。
CompareCommand = new AsyncRelayCommand(async (o) => await OnCompareAsync());