雖然肯定不是最好的做法有一個變通。創建一個事件並從構造函數中調用該事件。
解決方法是事件處理程序可以是異步並調用事件不會阻止UI線程。
public class IdeasViewModel : ViewModelBase {
public List<IdeaResource> IdeasList;
public IdeasViewModel() {
Initialized += OnInitialized;
Initialized(this, EventArgs.Empty);
}
private event EventHandler Initialized = delegate { };
private async void OnInitialized(object sender, EventArgs e) {
//unsubscribing from the event
Initialized += OnInitialized;
//call async
var client = new HypermediaClient();
IdeasList = await client.GetIdeasAsync();
}
}
在理想情況下的數據負載的功能應該是在一個公衆可獲得的方法
public async Task LoadDataAsync() {
var client = new HypermediaClient();
IdeasList = await client.GetIdeasAsync();
}
和稱爲在視圖的事件處理程序。
public class IdeasPage : ContentPage {
private IdeasViewModel viewModel;
public IdeasPage() {
//...assign variables
}
protected override void OnAppearing() {
this.Appearing += Page_Appearing;
}
private async void Page_Appearing(object sender, EventArgs e) {
//...call async code here
await viewModel.LoadDataAsync();
//unsubscribing from the event
this.Appearing -= Page_Appearing;
}
}
請更具體一些。通過等待任務加載異步數據...就像任何其他時間異步獲取函數的返回值 –
BradleyDotNET
沒有最佳實踐,只是上下文中的良好實踐。 – EJoshuaS