Estados de trabajo de BITS

Hay cuatro clases de estados de BITS: inicio, acción, transferencia y final. A medida que se ejecuta un trabajo, realiza la transición entre estados de las distintas clases de estado. Una vez que un trabajo está en un estado final, no se moverá del estado final y no se mostrará en una enumeración de trabajos.

Métodos de cambio de estado

Hay cuatro métodos de cambio de estado en un trabajo: Cancel, Complete, Resume y Suspend. Siempre que un trabajo no esté en un estado final, puede llamar a cualquiera de los métodos de cambio de estado.

El método Suspend se usa para cambiar un trabajo al estado SUSPENDED. Cuando se suspende un trabajo, todas sus transferencias se detendrán y no se reanudarán hasta que llames a Resume. Un trabajo que ya está suspendido simplemente permanecerá suspendido.

El método Resume se usa para iniciar un trabajo suspendido. Los trabajos en un estado de error o de error transitorio se configurarán para que se vuelvan a intentar. Los trabajos que están actualmente en un estado de acción permanecerán en ese estado.

El método Cancel se usa para cancelar un trabajo. El estado cambiará a cancelado. Los archivos que se transfieren actualmente no se completarán. Se eliminarán todos los archivos completamente transferidos y parcialmente transferidos.

El método Complete finalizará una transferencia. Los archivos totalmente descargados se conservarán; Se eliminarán los archivos que no se transfieren completamente.

Debe llamar a Cancel o Complete para mover el trabajo a un estado final y limpiarlo. Los trabajos que no se pasan a un estado final desperdiciarán los recursos del sistema. BITS finalmente cancelará automáticamente los trabajos antiguos. JobInactivityTimeout predeterminado es cancelar trabajos después de 90 días.

Estado inicial

El estado inicial es SUSPENDED. Desde aquí, puede agregar archivos al trabajo y establecer las propiedades de trabajo y archivo. Para iniciar una transferencia de trabajo, llame a Resume en el trabajo. Si reanuda un trabajo sin archivos, devolverá un código de error BG_E_EMPTY y el trabajo permanecerá suspendido.

Estados de acción

Los estados QUEUED, CONNECTING y TRANSFERING muestran la actividad interna actual del trabajo. Un trabajo que es QUEUED está listo para programarse, posiblemente esperando a que el programador de BITS o espere a que el usuario inicie sesión. Un trabajo que es CONNECTING está intentando conectarse al servidor para empezar a transferir archivos. Un trabajo que es TRANSFERING está cargando o descargando activamente los archivos.

El estado ERROR TRANSITORIO significa que el trabajo intentó y no pudo transferir el archivo. Esto puede deberse a razones de directiva de red; es posible que el trabajo se bloquee porque la red actual es demasiado costosa. También puede bloquearse por motivos del sistema, como el sistema que está en modo de ahorro de batería o juego, o porque no hay conectividad a Internet.

Bits volverá a intentar automáticamente los trabajos en el estado de error transitorio cuando corresponda. BITS incluye un valor MinimumRetryDelay y NoProgressTimeout para controlar cuándo se reintenta un trabajo y cuándo BITS finalmente detendrá el reintento.

Estados transferidos

Los estados transferidos se producen cuando no hay más transferencias que se van a realizar. Debe cancelar o completar un trabajo en este estado. También puede agregar más archivos para transferir y llamar a Resume(), pero esto no es una práctica común.

El estado ERROR se produce cuando se realiza una transferencia (no se reintenta), pero no se realizó correctamente. Todos los archivos deben transferirse para que se realicen correctamente; si se ha producido un error permanente en el trabajo, se producirá un error. Normalmente, llamará a Cancel o Complete para mover el trabajo a un estado final. La diferencia práctica es que, al llamar a Cancel, se eliminará cualquier archivo transferido correctamente, pero si llama a Complete, no se eliminará ningún archivo transferido correctamente.

Entre los motivos por los que se encuentra en un estado ERROR se incluyen

  • Permanecer demasiado tiempo en un estado DE ERROR TRANSITORIO (más allá del valor NoProgressTimeout ).
  • Obtención de un error de BG_E_TOKEN_REQUIRED y necesidad de ayuda con tokens auxiliares

Es una práctica habitual volver a configurar un trabajo error y, a continuación, llamar a Resume para reintentar el trabajo. Por ejemplo, es posible que la aplicación tenga que actualizar el nombre remoto de un archivo a través de SetRemoteName.

El estado TRANSFERED se produce cuando se realiza una transferencia y se realiza correctamente. Debe llamar a Complete para finalizar el trabajo; para los trabajos de descarga, los archivos descargados no estarán disponibles hasta después de llamar a Complete. La excepción a esta regla es los trabajos que son los trabajos de alto rendimiento (y todavía debe llamar a Complete).

Estados finales

Una vez que un trabajo está en un estado final, no se puede llamar a ninguno de los métodos de cambio de estado. El trabajo será CONFIRMADO después de llamar a Complete() y todos los archivos descargados completados estarán disponibles. El trabajo se cancelará después de llamar a Cancel() y se eliminarán todos los archivos descargados.

Ciclo de vida de un trabajo de BITS

El ciclo de vida de un trabajo de BITS comienza cuando se crea un trabajo. Un trabajo es un contenedor que contiene uno o varios archivos que se van a transferir. Un trabajo también tiene propiedades que especifican cómo BITS transfiere los archivos e interactúa con la aplicación. Por ejemplo, puede especificar la prioridad del trabajo, si el trabajo es un trabajo de carga o descarga, y para qué eventos desea recibir la notificación.

Después de crear el trabajo, agregue uno o varios archivos (los trabajos de carga solo pueden contener un archivo) al trabajo y cambie cualquiera de los valores de propiedad según corresponda para la aplicación. Al agregar un archivo al trabajo, especifique el nombre local (cliente) y remoto (servidor) del archivo. El nombre de archivo remoto debe usar el protocolo HTTP, HTTPS o SMB. Los archivos de un trabajo se procesan secuencialmente (en primer lugar, primero en salir).

BITS suspende automáticamente los trabajos cuando se crean. Debe reanudar el trabajo para activarlo en la cola de transferencia. Puede suspender o reanudar un trabajo en cualquier momento. La reanudación del trabajo mueve el trabajo del estado suspendido al estado en cola. El trabajo permanece en estado en cola hasta que el programador determina que es el turno del trabajo para transferir archivos. Todos los trabajos en primer plano se ejecutan simultáneamente con un trabajo en segundo plano. BITS procesa los archivos dentro de trabajos en primer plano en serie.

Cuando es el turno de un trabajo para transferir archivos, el trabajo se mueve al estado de conexión mientras BITS se conecta al servidor remoto (especificado en el nombre de archivo remoto). Si BITS puede conectarse al servidor remoto, el trabajo pasa al estado de transferencia donde permanece hasta que finaliza su segmento de tiempo, se completa la transferencia, se produce un error o la aplicación suspende el trabajo.

El trabajo se mueve entre los estados en cola, conexión y transferencia hasta que BITS transfiere todos los archivos del trabajo. En ese momento, el trabajo se mueve al estado transferido. BITS usa la programación round robin para programar trabajos que están en el mismo nivel de prioridad. Cada trabajo recibe un intervalo de tiempo para procesar sus archivos. Si el trabajo no se completa durante su segmento de tiempo, el trabajo vuelve al estado en cola y se activa el siguiente trabajo de la cola. Esto impide que los trabajos grandes bloqueen trabajos más pequeños. Los trabajos se procesan en gran medida en primer lugar, primero en salir (FIFO); sin embargo, BITS no puede garantizar el procesamiento FIFO debido a la programación round robin, los errores de trabajo y los reinicios del servicio.

Los archivos transferidos no están disponibles para el cliente hasta que la aplicación llame al método IBackgroundCopyJob::Complete para transferir la propiedad de los archivos de BITS al usuario. Los trabajos de carga también se establecen en el estado transferido cuando el servidor recibe correctamente el archivo. Los trabajos de carga-respuesta se establecen en el estado transferido después de que el archivo se envíe correctamente al servidor y la respuesta de la aplicación de servidor se transfiere correctamente al cliente.

Si se produce un error, el trabajo pasa al estado de error irrecuperable o transitorio. Los errores irrecuperables son errores que BITS no se pueden recuperar o que requieren intervención para corregir. Si la aplicación puede corregir el error, la aplicación reanuda el trabajo y BITS mueve el trabajo al estado en cola. Los errores transitorios son errores que pueden resolverse por sí mismos. BITS reintenta los trabajos en el estado de error transitorio hasta que la transferencia se realiza correctamente o se agota el tiempo de espera del trabajo. El trabajo agota el tiempo de espera cuando no se realiza ningún progreso dentro de un período especificado por la aplicación. Si el trabajo agota el tiempo de espera, BITS mueve el trabajo al estado de error irrecuperable.

Para obtener más información sobre los estados de trabajo, consulte BG_JOB_STATE.