2013-12-19 141 views
1

我正在使用MvvmCross創建PCL。 我打電話給命令中的一種方法,它通過調用Web服務來獲取數據。 我想異步執行此數據提取操作。 我該如何申請異步等待命令中的方法?異步並等待MvvmCross中的方法

任何想法?

回答

6

有幾個選項。

1)您可以通過async void方法/委託實現該命令。如果你這樣做,我建議你有async void方法只是await一個Taskasync 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()); 
    } 
    } 
} 
+0

你可以舉一些樣例代碼嗎?請......... – Suraj

+0

@Stephen我認爲你的api應該包括入門wiki。或者你有任何博客討論api? –

+0

@ShittuOlugbenga:我開發了一個類似的例子[在這裏](http://msdn.microsoft.com/en-us/magazine/dn605875.aspx)。 –

0

您應該通過使用數據綁定該屬性做數據綁定的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; 
      }); 
     }); 
    } 
}