异步并等待MvvmCross中的方法

时间:2013-12-19 10:38:26

标签: mvvmcross

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

有什么想法吗?

2 个答案:

答案 0 :(得分:6)

有几种选择。

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

2)您可以让命令启动一个返回Task<T>的方法,并使用NotifyTaskCompletion from my AsyncEx library将操作结果公开为属性。这允许您将数据绑定到结果以及错误。但是,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"));
    }
  }
}

使用第二个选项:

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());
    }
  }
}

答案 1 :(得分:0)

您应该使用mvvmcross的数据绑定并使用async await或@Stephen Cleary之类的任务来为该属性进行数据绑定

void FetchData(Action<T> callback)
{
   Task.Run<T>(()=>{
       return Service.GetDataSynchronous();
   }).ContinueWith((data)=>{
       callback(data);
   });
}
public MvxCommand
{
   get 
   {
       return new MvxCommand(()=>{
            FetchData((data)=>{
                this.Property = data;
            });
       });
   }
}