2016-04-01 8 views
0

私はメインのUIスレッドからAPIコールを処理するための2つの異なるアプローチを考え出しました。どちらがパフォーマンスやリソース割り当ての面で優れているのでしょうか。これらはAndroid固有の例ですが、iOSと同様の設定をしていますので、クロスプラットフォームでの検討が必要です。最高のバックグラウンド処理/ API呼び出しのアプローチですか?

オプション1 - 要求のために新しいスレッドをキックオフし、UIスレッドでコールバックに応答を処理する:

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(); 
    } 

オプション2 - レバレッジ非同期/の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(); 
    }; 

async/awaitを使用すると、明らかにコードがより簡潔になります。別のコールバックメソッドは必要ありません。しかし、私はこれらの2つのオプションがパフォーマンスの面でどのように積み重なっているのか疑問に思います。私はXamarinがC#をプラットフォーム固有のロジック(iOSとAndroid)に変換/変換することを前提としていますが、これは処理しやすく、パフォーマンスの影響はありますか?

+1

'GetJsonTestAsync'に固執それはあなたが使用して、ライブラリ、および'非同期/ await'によって提供されます場合。 'GetJsonTest'への呼び出しをラップするために余分なスレッドを使用しないでください。このガイドラインは、Xamarin固有のものではありません。メモには、['Task.Run'](https://developer.xamarin.com/api/member/System.Threading.Tasks.Task.Run/p/System.Action/)APIがあります。低レベルのスレッドAPIを使用する必要があります。 – Noseratio

答えて

0

iOSでは答えが異なります。短い答えは "Use GCD"です。 GCD(Grand Central Dispatch)は、並行タスクのきれいな管理を提供するシンプルなライブラリです。

GCDは、あなたの代わりにシステムスレッドのプールを管理します。

Appleは、重要なリソースであり物理的なメモリを結びつけ、作成/破棄するのにかなりの費用がかかるため、pthreadを直接使用することをお勧めしません。

(私はネイティブのiOS開発について話している。Xamarinについて何も知らない)

関連する問題