我正在開發一個Xamarin Forms應用程序,但我不認爲我的問題是Xamarin特定的。 用戶輸入PIN碼後(當然只有PIN碼是正確的),我給他看標籤頁。每個頁面都有一些控件,但更重要的是,每個頁面都必須使用異步調用從Web獲取一些數據。現在,由於我的應用程序有幾個選項卡,我想爲它們中的每一個並行(非連續)提取所有數據。我到目前爲止所實現的,是這樣的:如何在後臺準備應用程序數據?
public MainTabbedPage(bool requirePin)
{
if (requirePin)
{
Navigation.PushModalAsync(new PinEntryPage(this));
}
InitializeComponent();
}
public void InitializeChildren()
{
try
{
var page1 = new Page1();
page1.RefreshData();
var page2 = new Page2();
page2.RefreshButtons();
page2.RefreshData();
var page3 = new Page3();
page3.RefreshData();
Children.Add(page1);
Children.Add(page2);
Children.Add(page3);
}
catch (Exception ex)
{
// some error handling...
}
}
而所有RefreshData()
和RefreshButtons()
是這樣的:現在
public void RefreshData()
{
Task.Run(
() =>
{
var data = ApiSingleton.Instance.GetData().Result;
// some data manipulations
Device.BeginInvokeOnMainThread(() => /* some UI manipulation*/);
}
});
}
,而這似乎是在做正確的,我不知道這是一個正確的這樣做的方式,如果沒有,是什麼?
'GetData()'似乎是一個任務。所以你可以簡單地等待他的結果,在'RefreshData'異步之後。不需要'Task.Run()'imo – lokusking
'GetData()'看起來像一個異步方法(因爲你觸摸'Result'),所以爲什麼不真正地讓整個鏈正確異步並且不要亂丟任務? –
確實是異步的,謝謝。順便說一句,這意味着我不需要'Device.BeginInvokeOnMainThread',對吧? – nicks