MVVM Toolkit中向AsyncRelayCommand传递匿名函数的正确方式是什么?
MVVM Toolkit中AsyncRelayCommand传递匿名函数的正确方式
针对你给出的两种写法,结论是:Approach1写法更优,Approach2功能可行但冗余,具体原因如下:
核心差异解析
AsyncRelayCommand的构造函数接收的是Func<Task>类型的参数——本质只要求返回一个Task对象即可:
- Approach1:
new AsyncRelayCommand(() => SomeAsyncMethod(parameter))
直接返回SomeAsyncMethod执行后的Task,没有额外的编译器生成代码,写法简洁且无多余性能开销,是最推荐的方式。 - Approach2:
new AsyncRelayCommand(async () => await SomeAsyncMethod(parameter))
用async/await包裹后,编译器会生成额外的异步状态机。虽然功能上完全正常,但属于没必要的包装——因为SomeAsyncMethod本身已经返回Task,不需要再通过await拆包后重新封装成Task。
特殊场景说明
如果你的匿名函数里除了调用异步方法,还需要执行其他同步逻辑,比如:
new AsyncRelayCommand(async () => { // 同步逻辑:比如更新UI状态、参数校验等 IsBusy = true; await SomeAsyncMethod(parameter); IsBusy = false; })
这种情况下async/await是必须的,因为需要在异步流程中穿插同步操作。但如果只是单纯转发异步方法的Task,Approach1的写法是最佳选择。
内容的提问来源于stack exchange,提问作者Emilis Vadopalas
相关产品推荐
相关产品推荐

