XAsyncBlock
Veamos XAsyncBlock en detalle. Es una estructura definida de la siguiente manera:- queue: un XTaskQueueHandle, que es un identificador que representa información sobre dónde ejecutar un fragmento de trabajo. Si no se establece este parámetro, se usa una cola predeterminada.
- context: le permite pasar datos a la función de devolución de llamada.
- callback: una función de devolución de llamada opcional a la que se llamará una vez realizado el trabajo asincrónico. Si no especifica una devolución de llamada, puede esperar a que XAsyncBlock se complete con XAsyncGetStatus y, a continuación, obtener los resultados.
Importante: Un XAsyncBlock debe permanecer en memoria hasta que se complete la tarea asincrónica. Si se asigna dinámicamente, puede eliminarse dentro de la devolución de llamada de finalización de XAsyncBlock.
Espera de una tarea asincrónica
Puede saber que una tarea asincrónica se ha completado de dos formas diferentes:- Se llama a la devolución de llamada de finalización de XAsyncBlock.
- Llame a XAsyncGetStatus con true para esperar hasta que se complete.
Obtención del resultado de la tarea asincrónica
Para obtener el resultado, la mayoría de las funciones de API asincrónicas tienen una función Result correspondiente para recibir el resultado de la llamada asincrónica. En nuestro código de ejemplo, PFProfilesGetProfileAsync tiene una función PFProfilesGetProfileGetResult correspondiente. Puede usar esta función para recuperar el resultado de la función y actuar en consecuencia. Para obtener todos los detalles sobre la recuperación de resultados, consulte la documentación de cada función de API asincrónica.XTaskQueueHandle
XTaskQueueHandle le permite determinar qué subproceso ejecuta la tarea asincrónica y qué subproceso llama a la devolución de llamada de finalización de XAsyncBlock. Puede controlar qué subproceso realiza estas operaciones estableciendo un modo de distribución. Hay tres modos de distribución disponibles:- Manual: la cola manual no se distribuye automáticamente. Corresponde al desarrollador distribuirlas en el subproceso que quiera. Esto puede usarse para asignar el lado de trabajo o el de devolución de llamada de una llamada asincrónica a un subproceso específico.
- Thread Pool: la distribución se realiza mediante un grupo de subprocesos. El grupo de subprocesos invoca las llamadas en paralelo, tomando por turno una llamada de la cola para ejecutarla a medida que los subprocesos del grupo quedan disponibles. Thread Pool es el más fácil de usar, pero le da la menor cantidad de control sobre qué subproceso se usa.
- Serialized Thread Pool: la distribución se realiza mediante un grupo de subprocesos. El grupo de subprocesos invoca las llamadas en serie, tomando por turno una llamada de la cola para ejecutarla a medida que el único subproceso del grupo queda disponible.
- Immediate: distribuye inmediatamente el trabajo en cola en el subproceso desde el que se envió.
Distribución manual de un XTaskQueueHandle
Si usó el modo de distribución de cola manual para una cola de trabajo o de finalización de un XTaskQueueHandle, debe realizar la distribución manualmente. Supongamos que se creó un XTaskQueueHandle en el que tanto la cola de trabajo como la cola de finalización están configuradas para distribuirse manualmente, de esta forma:- queue: la cola en la que distribuir el trabajo.
- port: una instancia de la enumeración XTaskQueuePort.
- timeoutInMs: un uint32_t para el tiempo de espera en milisegundos.
Cuándo llamar a XTaskQueueDispatch
Para comprobar cuándo la cola ha recibido un nuevo elemento, puede llamar a XTaskQueueRegisterMonitor para establecer un controlador de eventos que informe a su código de que hay trabajo o finalizaciones listos para distribuirse.- queue: la cola asincrónica para la que envía la devolución de llamada.
- callbackContext: un puntero a los datos que deben pasarse a la devolución de llamada de envío.
- callback: la función invocada cuando se envía una nueva devolución de llamada a la cola.
- token: un token que se usa en una llamada posterior a XTaskQueueUnregisterMonitor para quitar la devolución de llamada.
