异步并等待MvvmCross中的方法

Sur*_*raj 1 mvvmcross

我正在使用MvvmCross创建PCL.我在Command中调用一个方法,通过调用Web服务来获取数据.我想异步执行此数据获取操作.如何在Command中应用异步等待方法?

有任何想法吗?

Ste*_*ary 6

有几种选择.

1)您可以使用async void方法/委托实现该命令.如果你这样做,我建议你有async void刚刚方法await一个Taskasync Task包含实际的逻辑,因为方法async Task的方法更容易进行单元测试.此外,您还需要try/ catch以进行正确的错误处理.

2)您可以让命令只是启动一个返回的方法,Task<T>并使用NotifyTaskCompletion我的AsyncEx库将操作结果公开为属性.这允许您将数据绑定到结果以及错误.但是,AsyncEx不支持MvvmCross所做的所有平台(特别是Windows Phone 7.0和Xamarin.Mac).

更新 - 示例:

使用第一个选项:

public ICommand ContactSlodgeCommand
{
  get
  {
    return new MvxCommand(async () =>
    {
      await ComposeEmailAsync("me@slodge.com", "About MvvmCross and the SQL Bits app", "I've got a question"));
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

使用第二个选项:

private INotifyTaskCompletion<MyResource> _resource;
public INotifyTaskCompletion<MyResource> Resource
{
  get { return _resource; }
  set { _resource = value; NotifyPropertyChanged(); }
}

public ICommand LoadResourceCommand
{
  get
  {
    return new MvxCommand(() =>
    {
      Resource = NotifyTaskCompletion.Create(LoadResourceAsync());
    }
  }
}
Run Code Online (Sandbox Code Playgroud)