2016-04-01 14 views
0

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?

+1

-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

Antwort

0

Die Antwort ist für iOS anders. Die kurze Antwort lautet "GCD verwenden". GCD (Grand Central Dispatch) ist eine einfache Bibliothek, die eine sehr saubere Verwaltung gleichzeitiger Aufgaben bietet.

GCD verwaltet in Ihrem Auftrag einen Pool von Systemthreads.

Apple rät STRENG dringend davon ab, pthreads direkt zu verwenden, da sie eine kritische Ressource darstellen und physischen Speicher binden und ziemlich teuer sind, um sie zu erstellen/zu zerstören.

(Ich weiß nicht, etwas über Xamarin. Ich spreche von nativen iOS-Entwicklung)

Verwandte Themen