2014-02-07 38 views
2

如何在此代码中传递framworkElement并使用async关键字?如何在lambda方法中传递参数和async关键字?

SaveImage = new RelayCommand<FrameworkElement>(frameworkElementForPrint => 
{ 
    StorageFile file = await PickImageFileToSave(); 
    SaveVisualElementToFile(frameworkElementForPrint, file); 
}); 

Becaue现在还不能使用的await ...

+2

假设这种类型不是专门为支持“异步”lambda而设计的,答案很可能是“你不能”。 (至少不是一种有意义的方式,你可以编译它,但它不会按预期工作。) – Servy

回答

5

我建议你所有因素的逻辑放到一个单独的方法,因为这样的:

public async Task SaveImageAsync(FrameworkElement frameworkElementForPrint) 
{ 
    StorageFile file = await PickImageFileToSaveAsync(); 
    await SaveVisualElementToFileAsync(frameworkElementForPrint, file); 
} 

然后包装到这RelayCommand

SaveImage = new RelayCommand<FrameworkElement>(async arg => { await SaveImageAsync(arg); }); 

这种分离允许您单元测试逻辑(当然假设你用适当的抽象重构)。

This MSDN article有关于async命令的更多详细信息。

+0

这个lambda的目的是什么?如果你创建了命名方法,为什么不写'新的RelayCommand (SaveImageAsync)'? – Servy

+2

lambda将'async Task'转换为'async void'。当然应该避免,但在这种情况下(实现'ICommand.Execute'),它是*逻辑*事件处理程序。 –

+0

我会在一分钟内尝试,但看起来不错。我只是不明白,为什么不用两个方法在lamba中工作,但使用一个名为方法 – Krekkon