Vytváření vláken v Xamarin.iOS

Modul runtime Xamarin.iOS poskytuje vývojářům přístup k rozhraním API pro podprocesy .NET, a to explicitně při použití vláken (System.Threading.Thread, System.Threading.ThreadPool) i implicitně při použití vzorů asynchronních delegátů nebo metod BeginXXX a také k celé řadě rozhraní API, která podporují paralelní knihovnu úloh.

Xamarin důrazně doporučuje používat knihovnu TPL (Task Parallel Library ) k vytváření aplikací z několika důvodů:

  • Výchozí plánovač TPL deleguje provádění úloh do fondu vláken, což zase dynamicky zvýší počet vláken potřebných při zpracování, a zároveň zabrání scénáři, kdy příliš mnoho vláken skončí soupeřit o čas procesoru.
  • Z hlediska úkolů TPL je snazší uvažovat o operacích. Můžete s nimi snadno manipulovat, naplánovat je, serializovat jejich spuštění nebo spustit mnoho paralelně s bohatou sadou rozhraní API.
  • Je základem pro programování s novými asynchronními jazykovými rozšířeními jazyka C#.

Fond vláken bude pomalu růst počtu vláken podle potřeby na základě počtu jader procesoru dostupných v systému, zatížení systému a požadavků vaší aplikace. Tento fond vláken můžete použít buď vyvoláním metod, System.Threading.ThreadPool nebo pomocí výchozího System.Threading.Tasks.TaskScheduler nastavení (součást paralelních architektur).

Vývojáři obvykle používají vlákna, když potřebují vytvářet responzivní aplikace a nechtějí blokovat hlavní smyčku spuštění uživatelského rozhraní.

Vývoj responzivních aplikací

Přístup k prvkům uživatelského rozhraní by měl být omezen na stejné vlákno, ve kterém běží hlavní smyčka pro vaši aplikaci. Pokud chcete provést změny hlavního uživatelského rozhraní z vlákna, měli byste kód zařadit do fronty pomocí NSObject.InvokeOnMainThread, například takto:

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

Výše uvedený kód vyvolá v rámci delegáta v kontextu hlavního vlákna, aniž by to způsobilo žádné konflikty časování, které by mohly způsobit selhání vaší aplikace.

Dělení na vlákna a uvolňování paměti

V průběhu provádění modul Objective-C runtime vytvoří a uvolní objekty. Pokud jsou objekty označeny jako "auto-release", Objective-C modul runtime tyto objekty uvolní do aktuálního NSAutoReleasePoolvlákna . Xamarin.iOS vytvoří jeden NSAutoRelease fond pro každé vlákno z System.Threading.ThreadPool a pro hlavní vlákno. Toto rozšíření pokrývá všechna vlákna vytvořená pomocí výchozího TaskScheduler v System.Threading.Tasks.

Pokud vytvoříte vlastní vlákna pomocí System.Threading vlastního NSAutoRelease fondu, abyste zabránili úniku dat. Chcete-li to provést, jednoduše zabalte vlákno do následující části kódu:

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

Poznámka: Vzhledem k tomu, že Xamarin.iOS 5.2 už nemusíte poskytovat své vlastní NSAutoReleasePool , protože se vám automaticky poskytne.