Subprocesamiento en Xamarin.iOS
El tiempo de ejecución de Xamarin.iOS proporciona a los desarrolladores acceso a las API de subprocesos de .NET, tanto explícitamente cuando se usan subprocesos ( ) como implícitamente cuando se usan los patrones de delegado asincrónicos o los métodos BeginXXX, así como la gama completa de API que admiten la biblioteca de tareas System.Threading.Thread, System.Threading.ThreadPool paralelas.
Xamarin recomienda encarecidamente usar la biblioteca TPL (Task Parallel Library) para compilar aplicaciones por algunos motivos:
- El programador de TPL predeterminado delegará la ejecución de tareas en el grupo de subprocesos, lo que a su vez aumentará dinámicamente el número de subprocesos necesarios a medida que se lleve a cabo el proceso, al tiempo que se evita un escenario en el que demasiados subprocesos terminan compitiendo por el tiempo de CPU.
- Es más fácil pensar en las operaciones en términos de tareas de TPL. Puede manipularlos fácilmente, programarlos, serializar su ejecución o iniciar muchos en paralelo con un amplio conjunto de API.
- Es la base para programar con las nuevas extensiones de lenguaje asincrónico de C#.
El grupo de subprocesos aumentará lentamente el número de subprocesos según sea necesario en función del número de núcleos de CPU disponibles en el sistema, la carga del sistema y las demandas de la aplicación. Puede usar este grupo de subprocesos mediante la invocación de métodos en o mediante el valor predeterminado System.Threading.ThreadPoolSystem.Threading.Tasks.TaskScheduler (parte de System.Threading.ThreadPool).
Normalmente, los desarrolladores usan subprocesos cuando necesitan crear aplicaciones con capacidad de respuesta y no quieren bloquear el bucle de ejecución de la interfaz de usuario principal.
Desarrollo de aplicaciones con capacidad de respuesta
El acceso a los elementos de la interfaz de usuario debe limitarse al mismo subproceso que ejecuta el bucle main para la aplicación. Si desea realizar cambios en la interfaz de usuario principal desde un subproceso, debe poner en cola el código mediante NSObject.InvokeOnMainThread, como se muestra a continuación:
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;
});
}
Lo anterior invoca el código dentro del delegado en el contexto del subproceso principal, sin provocar condiciones de carrera que podrían bloquear la aplicación.
Subprocesamiento y recolección de elementos no utilizados
En el transcurso de la ejecución, el Objective-C tiempo de ejecución creará y liberará objetos. Si los objetos se marcan para la "versión automática", el tiempo de ejecución liberará esos objetos Objective-C en el objeto actual del NSAutoReleasePool subproceso. Xamarin.iOS crea un NSAutoRelease grupo para cada subproceso a partir de y para el subproceso System.Threading.ThreadPool principal. Esto por extensión cubre todos los subprocesos creados mediante el taskScheduler predeterminado en System.Threading.Tasks.
Si crea sus propios subprocesos con , tendrá que proporcionar su propio System.Threading grupo para evitar que los datos se NSAutoRelease filtre. Para ello, basta con encapsular el subproceso en el siguiente fragmento de código:
void MyThreadStart (object arg)
{
using (var ns = new NSAutoReleasePool ()){
// Your code goes here.
}
}
Nota: Como Xamarin.iOS 5.2 ya no tiene que proporcionar los suyos propios, ya que uno se le NSAutoReleasePool proporcionará automáticamente.