我正在使用MvvmCross創建PCL。 我打電話給命令中的一種方法,它通過調用Web服務來獲取數據。 我想異步執行此數據提取操作。 我該如何申請異步和等待命令中的方法?異步並等待MvvmCross中的方法
任何想法?
我正在使用MvvmCross創建PCL。 我打電話給命令中的一種方法,它通過調用Web服務來獲取數據。 我想異步執行此數據提取操作。 我該如何申請異步和等待命令中的方法?異步並等待MvvmCross中的方法
任何想法?
有幾個選項。
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("[email protected]", "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());
}
}
}
您應該通過使用數據綁定該屬性做數據綁定的mvvmcross和使用異步等待或任務像@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;
});
});
}
}
你可以舉一些樣例代碼嗎?請......... – Suraj
@Stephen我認爲你的api應該包括入門wiki。或者你有任何博客討論api? –
@ShittuOlugbenga:我開發了一個類似的例子[在這裏](http://msdn.microsoft.com/en-us/magazine/dn605875.aspx)。 –