我正在使用MvvmCross创建PCL。 我在命令中调用一个方法,它通过调用Web服务来获取数据。 我想异步执行此数据获取操作。 如何将 async 和等待应用于Command中的方法?
有什么想法吗?
答案 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;
});
});
}
}