Ich habe zwei verschiedene Ansätze für die Behandlung eines API-Aufrufs aus dem Haupt-UI-Thread entwickelt, und ich frage mich, welcher in Bezug auf Leistung oder Ressourcenzuweisung besser ist. Das sind Android-spezifische Beispiele, aber ich habe ein ähnliches Setup für iOS, also suche nach einer Antwort mit plattformübergreifender Betrachtung.Beste Verarbeitung von Hintergrundverarbeitung/API-Aufruf?
Option 1 - einen neuen Thread für die Anforderung Anstoß, und auf dem UI-Thread Antwort im Callback-Griff:
apiTestButton.Click += delegate
{
progressBar1.Visibility = ViewStates.Visible;
new Thread(new ThreadStart(() =>
{
string response = Core.BLL.API.GetJsonTest();
RunOnUiThread(() => ApiTestCallback(response));
})).Start();
};
void ApiTestCallback(string response)
{
progressBar1.Visibility = ViewStates.Invisible;
Toast.MakeText(this.ApplicationContext, "API response: " + response, ToastLength.Long)
.Show();
}
Option 2 - Hebel Async/Await:
apiAsyncTestButton.Click += async (sender, e) =>
{
progressBar1.Visibility = ViewStates.Visible;
string response = Core.BLL.API.GetJsonTestAsync().Result;
progressBar1.Visibility = ViewStates.Invisible;
Toast.MakeText(this.ApplicationContext, "API response: " + response, ToastLength.Long)
.Show();
};
Mit async/await ist der Code offensichtlich ein wenig prägnanter - keine Notwendigkeit für eine separate Callback-Methode. Aber ich frage mich, wie diese zwei Optionen in Bezug auf die Leistung stapeln. Ich gehe davon aus, dass Xamarin C# in plattform-native Logik (iOS und Android) übersetzt/transformiert, aber was wäre einfacher zu handhaben und gibt es Auswirkungen auf die Leistung?
-Stick mit 'GetJsonTestAsync', wenn sie von der Bibliothek zur Verfügung gestellt haben Sie verwenden, und' async/await'. Verwenden Sie keinen zusätzlichen Thread, um einen Aufruf an "GetJsonTest" zu übergeben. Diese Richtlinie ist nicht Xamarin-spezifisch, BTW. Nebenbei bemerkt gibt es ['Task.Run'] (https://developer.xamarin.com/api/member/System.Threading.Tasks.Task.Run/p/System.Action/) API und Sie fast nie müssen die Low-Level-Thread-APIs verwenden. – Noseratio