Threading v Xamarin.iOS
Modul runtime Xamarin.iOS poskytuje vývojářům přístup k rozhraním API pro zpracování vláken .NET, a to jak explicitně při použití vláken ( ), tak implicitně při použití vzorů asynchronního delegáta nebo metod BeginXXX, stejně jako k celé řadě rozhraní API, která podporují System.Threading.Thread, System.Threading.ThreadPool Task Parallel Library.
Xamarin důrazně doporučuje k vytváření aplikací používat knihovnu TPL (Task Parallel Library), a to z několika důvodů:
- Výchozí plánovač TPL deleguje provádění úlohy na fond vláken, který pak dynamicky zvětšuje počet vláken potřebných během procesu, a současně zabrání scénáři, kdy příliš mnoho vláken konkuruje času procesoru.
- O operacích je snazší přemýšlet z hlediska úloh TPL. Můžete s nimi snadno manipulovat, naplánovat je, serializovat jejich spuštění nebo paralelně spustit řadu s bohatou sadu rozhraní API.
- Je základem pro programování s novými rozšířeními asynchronního jazyka C#.
Fond vláken podle potřeby pomalu zvětšuje počet vláken 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 vyvoláním metod v nástroji nebo pomocí výchozí System.Threading.ThreadPoolSystem.Threading.Tasks.TaskScheduler hodnoty (součást System.Threading.ThreadPool
Vývojáři obvykle používají vlákna, když potřebují vytvářet responzivní aplikace a nechcete 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é 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,jak je vidět tady:
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á kód uvnitř delegátu v kontextu hlavního vlákna, aniž by to způsobilo jakékoli konfliktu časování, které by mohly způsobit selhání vaší aplikace.
Threading a uvolňování paměti
V průběhu provádění modul runtime vytvoří a uvolní Objective-C objekty. Pokud jsou objekty označeny příznakem "automatického vydání", modul runtime uvolní tyto objekty do Objective-C aktuálního vlákna NSAutoReleasePool . Xamarin.iOS vytvoří jeden fond pro každé vlákno z a NSAutoReleaseSystem.Threading.ThreadPool pro hlavní vlákno. Toto rozšíření pokrývá všechna vlákna vytvořená pomocí výchozího plánovače úloh v System.Threading.Tasks.
Pokud vytváříte vlastní vlákna pomocí nástroje , musíte poskytnout vlastní fond, aby nedošlo k úniku System.ThreadingNSAutoRelease 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ž nepotřebujete poskytovat vlastní, protože vám ho budete poskytovat NSAutoReleasePool automaticky.