Xamarin.iOS'ta İş Parçacığı Oluşturma

Xamarin.iOS çalışma zamanı, geliştiricilerin .NET iş parçacığı API'lerine hem iş parçacıkları (System.Threading.Thread, System.Threading.ThreadPool) kullanırken hem de zaman uyumsuz temsilci desenlerini veya BeginXXX yöntemlerini ve Görev Paralel Kitaplığını destekleyen tam API'leri kullanırken örtük olarak erişmesini sağlar.

Xamarin, birkaç nedenden dolayı uygulama oluşturmak için Görev Paralel Kitaplığı'nı (TPL) kullanmanızı kesinlikle önerir:

  • Varsayılan TPL zamanlayıcı, görev yürütmeyi iş parçacığı havuzuna devredecek ve bu da işlem sırasında gereken iş parçacığı sayısını dinamik olarak artıracak ve cpu süresi için çok fazla iş parçacığının rekabet ettiği bir senaryodan kaçınacaktır.
  • TPL Görevleri açısından işlemleri düşünmek daha kolaydır. Bunları kolayca işleyebilir, zamanlayabilir, yürütmelerini seri hale getirebilir veya zengin bir API kümesiyle paralel olarak birçoğunu başlatabilirsiniz.
  • Yeni C# zaman uyumsuz dil uzantılarıyla programlamanın temelini oluşturur.

İş parçacığı havuzu, sistemdeki kullanılabilir CPU çekirdeği sayısına, sistem yüküne ve uygulamanızın taleplerine bağlı olarak gerektiğinde iş parçacığı sayısını yavaşça büyütür. Bu iş parçacığı havuzunu, içindeki System.Threading.ThreadPool yöntemleri çağırarak veya varsayılanı System.Threading.Tasks.TaskScheduler (Paralel Çerçevelerin bir parçası) kullanarak kullanabilirsiniz.

Geliştiriciler genellikle duyarlı uygulamalar oluşturmaları gerektiğinde iş parçacıklarını kullanır ve ana kullanıcı arabirimi çalıştırma döngüsünü engellemek istemezler.

Duyarlı Uygulamalar Geliştirme

Ui öğelerine erişim, uygulamanız için ana döngü çalıştıran iş parçacığıyla sınırlı olmalıdır. Bir iş parçacığından ana kullanıcı arabiriminde değişiklik yapmak istiyorsanız, aşağıdaki gibi NSObject.InvokeOnMainThread kullanarak kodu kuyruğa almalıdır:

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

Yukarıdaki, uygulamanızın kilitlenme olasılığı olan herhangi bir yarış koşuluna neden olmadan, ana iş parçacığı bağlamında temsilcinin içindeki kodu çağırır.

İş Parçacığı Oluşturma ve Çöp Toplama

Yürütme işlemi boyunca çalışma Objective-C zamanı nesneleri oluşturur ve serbest bırakır. Nesneler "otomatik yayın" için işaretlenirse çalışma Objective-C zamanı bu nesneleri iş parçacığının geçerli NSAutoReleasePoolöğesine bırakır. Xamarin.iOS, ve ana iş parçacığından System.Threading.ThreadPool her iş parçacığı için bir NSAutoRelease havuz oluşturur. Uzantıya göre bu, System.Threading.Tasks içindeki varsayılan TaskScheduler kullanılarak oluşturulan tüm iş parçacıklarını kapsar.

Kullanarak System.Threading kendi iş parçacıklarınızı oluşturursanız, verilerin sızmasını önlemek için kendi NSAutoRelease havuzunuzu sağlamanız gerekir. Bunu yapmak için iş parçacığınızı aşağıdaki kod parçasına sarmalamanız yeterlidir:

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

Not: Xamarin.iOS 5.2'den bu yana, sizin için otomatik olarak sağlanacağı için artık kendi NSAutoReleasePool hizmetinizi sağlamanız gerekmez.