Xamarin. iOS 'da iş parçacığı oluşturma

Xamarin. iOS çalışma zamanı, geliştiricilere .NET iş parçacığı API 'Lerine, hem iş parçacıklarını () hem de System.Threading.Thread, System.Threading.ThreadPool zaman uyumsuz temsilci desenleri veya BeginXXX yöntemlerinin yanı sıra, görev paralel kitaplığını destekleyen tüm API 'lerin kullanımını açıkça kullanarak erişim sağlar.

Xamarin, birkaç nedenden dolayı uygulama oluşturmak için görev paralel kitaplığı (TPL) kullanmanızı önerir:

  • Varsayılan TPL Zamanlayıcı, iş parçacığı havuzuna görev yürütmeyi devreder, bu da işlem gerçekleştiği sırada gereken iş parçacığı sayısını dinamik olarak büyürken, çok fazla iş parçacığının CPU süresi için rekabet eden bir senaryoya karşı bir süre sonra da bu işlemi gerçekleştirir.
  • İşlemler için TPL görevleri açısından düşünmek daha kolay. Bunları kolayca işleyebilir, bunları zamanlayabilir, yürütmeyi serileştirme veya çok sayıda basit bir API kümesiyle paralel olarak başlatabilirsiniz.
  • Bu, yeni C# zaman uyumsuz dil uzantılarıyla programlama temelidir.

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

Genellikle geliştiriciler, yanıt veren uygulamalar oluşturmaya gerek duydukları iş parçacıklarını kullanır ve ana UI çalıştırma döngüsünü engellemek istemelerdir.

Yanıt veren uygulamalar geliştirme

UI öğelerine erişim, uygulamanız için ana döngüyü çalıştıran aynı iş parçacığıyla sınırlandırılmalıdır. Bir iş parçacığından ana Kullanıcı arabiriminde değişiklik yapmak istiyorsanız, aşağıdaki gibi NSObject. ınvokeonmainthreadkullanarak kodu sıraya almalısınız:

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 kod, uygulamanızı kilitlenebilecek yarış koşullarına neden olmadan, temsilcinin içindeki kodu ana iş parçacığı bağlamında çağırır.

İş parçacığı ve çöp toplama

Yürütme sırasında Objective-C çalışma zamanı nesneleri oluşturur ve serbest bırakılır. Nesneler "Auto-Release" için işaretlenmişler ise Objective-C çalışma zamanı bu nesneleri iş parçacığının geçerli öğesine serbest bırakabilir NSAutoReleasePool . Xamarin. iOS NSAutoRelease , System.Threading.ThreadPool ana iş parçacığı için ve öğesinden her iş parçacığı için bir havuz oluşturur. Bu uzantı, System. Threading. Tasks içindeki varsayılan TaskScheduler kullanılarak oluşturulan tüm iş parçacıklarını içerir.

Kullanarak kendi iş parçacıklarını oluşturursanız, System.ThreadingNSAutoRelease verilerin sızmasını engellemek için size kendi havuzunu sağlamanız gerekir. Bunu yapmak için iş parçacığını aşağıdaki kod parçasına sarın:

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

Not: Xamarin. iOS 5,2 ' den Itibaren NSAutoReleasePool sizin için otomatik olarak sağlanacaktır.