Bagikan melalui


Threading di Xamarin.iOS

Runtime Xamarin.iOS memberi pengembang akses ke API utas .NET, baik secara eksplisit saat menggunakan utas (System.Threading.Thread, System.Threading.ThreadPool) dan secara implisit saat menggunakan pola delegasi asinkron atau metode BeginXXX serta berbagai API yang mendukung Pustaka Paralel Tugas.

Xamarin sangat menyarankan Anda menggunakan Pustaka Paralel Tugas (TPL) untuk membangun aplikasi karena beberapa alasan:

  • Penjadwal TPL default akan mendelegasikan eksekusi Tugas ke kumpulan utas, yang pada gilirannya akan secara dinamis menumbuhkan jumlah utas yang diperlukan saat proses berlangsung, sambil menghindari skenario di mana terlalu banyak utas akhirnya bersaing untuk waktu CPU.
  • Lebih mudah untuk memikirkan operasi dalam hal Tugas TPL. Anda dapat dengan mudah memanipulasinya, menjadwalkannya, menserialisasikan eksekusinya, atau meluncurkan banyak secara paralel dengan sekumpulan API yang kaya.
  • Ini adalah fondasi untuk pemrograman dengan ekstensi bahasa asinkron C# baru.

Kumpulan utas akan secara perlahan menumbuhkan jumlah utas sesuai kebutuhan berdasarkan jumlah inti CPU yang tersedia pada sistem, beban sistem, dan permintaan aplikasi Anda. Anda dapat menggunakan kumpulan utas ini baik dengan memanggil metode di atau System.Threading.ThreadPool dengan menggunakan default System.Threading.Tasks.TaskScheduler (bagian dari Kerangka Kerja Paralel).

Biasanya pengembang menggunakan utas ketika mereka perlu membuat aplikasi responsif dan mereka tidak ingin memblokir perulangan eksekusi UI utama.

Mengembangkan Aplikasi Responsif

Akses ke elemen UI harus dibatasi pada utas yang sama yang menjalankan perulangan utama untuk aplikasi Anda. Jika Anda ingin membuat perubahan pada UI utama dari utas, Anda harus mengantre kode dengan menggunakan NSObject.InvokeOnMainThread, seperti ini:

MyThreadedRoutine ()  
{  
    var result = DoComputation ();  

    // we want to update an object that is managed by the main
    // thread; To do so, we need to ensure that we only access
    // this from the main thread:

    InvokeOnMainThread (delegate {  
        label.Text = "The result is: " + result;  
    });
}

Di atas memanggil kode di dalam delegasi dalam konteks utas utama, tanpa menyebabkan kondisi balapan apa pun yang berpotensi menabrak aplikasi Anda.

Pengumpulan Utas dan Sampah

Dalam eksekusi, Objective-C runtime akan membuat dan merilis objek. Jika objek ditandai untuk "rilis otomatis" Objective-C runtime akan merilis objek tersebut ke utas saat ini NSAutoReleasePool. Xamarin.iOS membuat satu NSAutoRelease kumpulan untuk setiap utas dari System.Threading.ThreadPool dan untuk utas utama. Ini dengan ekstensi mencakup utas apa pun yang dibuat menggunakan TaskScheduler default di System.Threading.Tasks.

Jika Anda membuat utas Anda sendiri menggunakan System.Threading Anda harus menyediakan kumpulan Anda sendiri NSAutoRelease untuk mencegah data bocor. Untuk melakukan ini, cukup bungkus utas Anda dalam bagian kode berikut:

void MyThreadStart (object arg)
{
   using (var ns = new NSAutoReleasePool ()){
      // Your code goes here.
   }
}

Catatan: Karena Xamarin.iOS 5.2 Anda tidak perlu menyediakan sendiri NSAutoReleasePool lagi karena akan disediakan secara otomatis untuk Anda.