如何在lambda方法中传递参数和async关键字?

Kre*_*kon 2 .net c# parallel-processing async-await windows-store-apps

如何在此代码中传递framworkElement并使用async关键字?

SaveImage = new RelayCommand<FrameworkElement>(frameworkElementForPrint =>  
{
    StorageFile file = await PickImageFileToSave();
    SaveVisualElementToFile(frameworkElementForPrint, file);
});
Run Code Online (Sandbox Code Playgroud)

现在等待不能用......

Ste*_*ary 6

我建议您将所有逻辑分解为单独的方法,如下所示:

public async Task SaveImageAsync(FrameworkElement frameworkElementForPrint)
{
  StorageFile file = await PickImageFileToSaveAsync();
  await SaveVisualElementToFileAsync(frameworkElementForPrint, file);
}
Run Code Online (Sandbox Code Playgroud)

然后将其包装成RelayCommand:

SaveImage = new RelayCommand<FrameworkElement>(async arg => { await SaveImageAsync(arg); });
Run Code Online (Sandbox Code Playgroud)

这种分离允许您对SaveImageAsync逻辑进行单元测试(当然假设您使用适当的抽象进行重构).

这篇MSDN文章有关于async命令的更多细节.

  • lambda将`async Task`转换为`async void`.当然应该避免这种情况,但在这种情况下(实现`ICommand.Execute`),它在逻辑上是一个事件处理程序. (2认同)