我想在我的 windows phone 8 MVVM 项目上使用 async/await,我正在努力寻找一种使用这个 api 实现我的 ICommands 的好方法。我一直在阅读有关该主题的几篇文章,我从下面的 MSDN 中偶然发现了这篇文章,其中指出我必须避免异步空洞,因为很难捕获未处理的异常:http: //msdn.microsoft.com/en -us/magazine/jj991977.aspx 在我问过的另一个问题中,有人还说我不应该使用异步空白。除非有事件。
但问题是我可以在互联网上找到的所有示例都使用异步无效。我发现的这两篇文章是示例: http ://richnewman.wordpress.com/2012/12/03/tutorial-asynchronous-programming-async-and-await-for-beginners/和 http://blog.mycupof.net /2012/08/23/mvvm-asyncdelegatecommand-what-asyncawait-can-do-for-uidevelopment/
最后一个是使用 async/await 的 ICommand 实现,但它也使用 async voids。我试图为此想出一个解决方案,所以我基于 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 吗?