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 NSAutoReleasePool
vlá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.