2014-02-07 62 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