我想在我的Windows Phone 8 MVVM项目中使用async / await,我已经阅读了一些关于这个主题的文章,我在下面的MSDN中碰到了这个,这说明我必须避免异步空洞,因为它很难 grab 未处理的异常:http://msdn.microsoft.com/en-us/magazine/jj991977.aspx在另一个问题我询问过这个问题时,有人还说我不应该使用异步空洞 . 除非有事件 .
最后一个是使用async / await的ICommand实现,但它也使用异步空洞 . 我正在尝试为此提出一个解决方案,所以我基于RelayCommand编写了ICommand的这个实现:
public delegate Task AsyncAction();
public class RelayCommandAsync : ICommand
{
private AsyncAction _handler;
public RelayCommandAsync(AsyncAction handler)
{
_handler = handler;
}
private bool _isEnabled;
public bool IsEnabled
{
get { return _isEnabled; }
set
{
if (value != _isEnabled)
{
_isEnabled = value;
if (CanExecuteChanged != null)
{
CanExecuteChanged(this, EventArgs.Empty);
}
}
}
}
public bool CanExecute(object parameter)
{
return IsEnabled;
}
public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
ExecuteAsync();
}
private Task ExecuteAsync()
{
return _handler();
}
}
我试图像这样使用它:在构造函数中:
saveCommand = new RelayCommandAsync(SaveSourceAsync);
然后:
private async Task SaveSourceAsync()
{
await Task.Run(() => { Save(); });
}
private void Save()
{
// Slow operation
}
问题是我对这个以及任何其他实现感到不舒服,因为我不知道哪个是最好的和最优的 .
任何人都可以说明我应该如何使用它,最好是使用MVVM?