Compartir a través de


Subprocesamiento en Xamarin.iOS

El entorno de ejecución de Xamarin.iOS proporciona a los desarrolladores acceso a las API de subprocesos de .NET, tanto explícitamente al usar subprocesos (System.Threading.Thread, System.Threading.ThreadPool) como implícitamente al usar los patrones de delegados asincrónicos o los métodos BeginXXX, así como la gama completa de API que admiten la biblioteca paralela de tareas.

Xamarin recomienda encarecidamente que use la Biblioteca paralela de tareas (TPL) para compilar aplicaciones por algunas razones:

  • 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 produzca el proceso, a la vez 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 System.Threading.ThreadPool o mediante el System.Threading.Tasks.TaskScheduler predeterminado (parte de Parallel Frameworks).

Normalmente, los desarrolladores usan subprocesos cuando necesitan crear aplicaciones con capacidad de respuesta y no quieren bloquear el bucle principal de ejecución de la interfaz de usuario.

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 principal de 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, de la siguiente manera:

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

El anterior invoca el código dentro del delegado en el contexto del subproceso principal, sin causar condiciones de carrera que pudieran bloquear la aplicación.

Subprocesos y recolección de elementos no utilizados

Durante la ejecución, el tiempo de ejecución Objective-C creará y liberará objetos. Si los objetos están marcados para "versión automática", el tiempo de ejecución Objective-C liberará esos objetos en el NSAutoReleasePool actual del subproceso. Xamarin.iOS crea un grupo de NSAutoRelease para cada subproceso desde el System.Threading.ThreadPool y para el subproceso principal. Esto por extensión cubre los subprocesos creados con el TaskScheduler predeterminado en System.Threading.Tasks.

Si crea sus propios subprocesos mediante System.Threading debe proporcionar su propio grupo de NSAutoRelease para evitar que los datos se filtren. Para ello, simplemente encapsula el subproceso en el siguiente fragmento de código:

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

Nota: A partir de Xamarin.iOS 5.2 ya no tiene que proporcionar su propio NSAutoReleasePool, ya que se le proporcionará automáticamente.