Ich entwickle eine Xamarin Forms-Anwendung, aber ich glaube nicht, dass meine Frage Xamarin-spezifisch ist. Nachdem der Benutzer den PIN-Code eingegeben hat (natürlich nur, wenn der PIN korrekt war), zeige ich ihm die Registerseite. Jede dieser Seiten hat einige Steuerelemente, aber noch wichtiger, sie müssen einige Daten aus dem Internet abrufen, indem sie asynchrone Aufrufe verwenden. Jetzt, da meine Anwendung mehrere Tabs hat, möchte ich alle Daten für jeden von ihnen parallel (nicht-aufeinanderfolgend) abrufen. Was ich bisher umgesetzt werden, ist dies:Wie bereitet man Anwendungsdaten im Hintergrund auf?
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...
}
}
während alle RefreshData()
und RefreshButtons()
sieht wie folgt aus:
public void RefreshData()
{
Task.Run(
() =>
{
var data = ApiSingleton.Instance.GetData().Result;
// some data manipulations
Device.BeginInvokeOnMainThread(() => /* some UI manipulation*/);
}
});
}
Jetzt, während dies, ich tun, Recht zu sein scheint sich fragen, ob es eine korrekte Art und Weise, es zu tun, und wenn nicht, was ist?
'GetData()' scheint zu einer Aufgabe. Sie können also einfach auf sein Ergebnis warten, nachdem Sie 'RefreshData' async gemacht haben. Keine Notwendigkeit für eine 'Task.Run()' da imo – lokusking
Die 'GetData()' sieht aus wie eine asynchrone Methode (da Sie das 'Ergebnis' berühren) warum also nicht eigentlich die gesamte Kette richtig async machen und keine Aufgaben herumwerfen? –
Es ist in der Tat async, danke. Übrigens bedeutet das, dass ich 'Device.BeginInvokeOnMainThread' nicht brauche, richtig? – nicks