Estados do trabalho do BITS
Há quatro classes de estados BITS: iniciação, ação, transferido e final. À medida que um trabalho é executado, ele faz a transição entre estados nas diferentes classes de estado. Quando um trabalho estiver em um estado final, ele não sairá do estado final e não aparecerá em uma enumeração de trabalho.
Métodos de mudança de estado
Há quatro métodos de alteração de estado em um trabalho: Cancelar, Concluir, Retomar e Suspender. Contanto que um trabalho não esteja em um estado final, você pode chamar qualquer um dos métodos de alteração de estado.
O método Suspend é usado para alternar um trabalho para o estado SUSPENDED. Quando um trabalho é suspenso, todas as suas transferências serão interrompidas e não serão retomadas até que você chame Retomar. Um trabalho que já está suspenso simplesmente permanecerá suspenso.
O método Resume é usado para iniciar um trabalho suspenso. Os trabalhos em um estado de erro ou erro transitório serão configurados para serem repetidos. Os empregos que estão atualmente em um estado de ação permanecerão nesse estado.
O método Cancel é usado para cancelar um trabalho. O estado passará para cancelado. Os arquivos que estão sendo transferidos atualmente não serão concluídos. Todos os arquivos completamente transferidos e parcialmente transferidos serão excluídos.
O método Complete concluirá uma transferência. Todos os arquivos totalmente baixados serão mantidos; Os arquivos que não forem totalmente transferidos serão excluídos.
Você deve chamar Cancelar ou Concluir para mover seu trabalho para um estado final e ser limpo. Os trabalhos que não são transferidos para um estado final desperdiçarão recursos do sistema. O BITS acabará cancelando automaticamente trabalhos antigos. O JobInactivityTimeout padrão é cancelar trabalhos após 90 dias.
Estado inicial
O estado inicial é SUSPENSO. A partir daqui, você pode adicionar arquivos ao trabalho e definir propriedades de trabalho e arquivo. Para iniciar uma transferência de trabalho, chame Retomar no trabalho. Se você retomar um trabalho sem arquivos, ele retornará um código de erro BG_E_EMPTY e o trabalho permanecerá suspenso.
Estados de ação
Os estados QUEUED, CONNECTING e TRANSFER mostram a atividade interna atual do seu trabalho. Um trabalho que está QUEUED está pronto para ser agendado, possivelmente aguardando o agendador do BITS ou aguardando que o usuário faça login. Um trabalho que está CONECTANDO está tentando se conectar ao servidor para iniciar a transferência de arquivos. Um trabalho que está TRANSFERINDO está carregando ou baixando ativamente seus arquivos.
O estado TRANSIENT ERROR significa que o trabalho tentou e falhou ao transferir o arquivo. Isso pode ser por motivos de diretiva de rede; O trabalho pode ser bloqueado porque a rede atual é muito cara. Ele também pode ser bloqueado por motivos do sistema, como o sistema estar no modo de economia de bateria ou jogo, ou porque não há conectividade com a internet.
Os trabalhos no estado de erro transitório serão repetidos automaticamente pelo BITS quando apropriado. O BITS inclui um valor MinimumRetryDelay e NoProgressTimeout para controlar quando um trabalho é tentado novamente e quando o BITS finalmente para de tentar novamente.
Estados transferidos
Os estados transferidos acontecem quando não há mais transferência a ser feita. Você deve cancelar ou concluir um trabalho nesse estado. Você também pode adicionar mais arquivos para transferir e chamar Resume(), mas essa não é uma prática comum.
O estado ERROR acontece quando uma transferência é feita (não será repetida), mas não foi totalmente bem-sucedida. Todos os arquivos devem ser transferidos para serem bem-sucedidos; Se algum deles tiver falhado permanentemente, o trabalho estará em erro. Normalmente, você chamará Cancelar ou Concluir para mover o trabalho para um estado final. A diferença prática é que quando você chamar Cancelar, qualquer arquivo transferido com êxito será excluído, mas se você chamar Complete, qualquer arquivo transferido com êxito não será excluído.
As razões para estar em um estado ERROR incluem:
- Permanecer muito tempo em um estado de ERRO TRANSITÓRIO (além da configuração NoProgressTimeout ).
- Obtendo um erro BG_E_TOKEN_REQUIRED e precisando de assistência com tokens auxiliares
É uma prática comum reconfigurar um trabalho de ERRO e, em seguida, chamar Resume para repetir o trabalho. Por exemplo, seu aplicativo pode precisar atualizar o nome remoto de um arquivo por meio de SetRemoteName.
O estado TRANSFERIDO acontece quando uma transferência é feita e ela foi bem-sucedida. Você deve ligar para Complete para finalizar o trabalho; para trabalhos de download, os arquivos baixados não estarão disponíveis até que você chame Concluído. A exceção a essa regra são os trabalhos que são os trabalhos de alto desempenho (e você ainda deve chamar Complete).
Estados finais
Quando um trabalho está em um estado final, você não pode chamar nenhum dos métodos de alteração de estado. O trabalho será RECONHECIDO depois que você chamar Complete() e todos os arquivos baixados concluídos estarão disponíveis. O trabalho será CANCELADO depois que você chamar Cancel() e todos os arquivos baixados serão excluídos.
Ciclo de vida de um trabalho BITS
O ciclo de vida de um trabalho do BITS começa quando você cria um trabalho. Um trabalho é um contêiner que contém um ou mais arquivos para transferir. Um trabalho também tem propriedades que especificam como o BITS transfere os arquivos e interage com seu aplicativo. Por exemplo, você pode especificar a prioridade do trabalho, se o trabalho é um trabalho de upload ou download e para quais eventos você deseja receber notificação.
Depois de criar o trabalho, adicione um ou mais arquivos (os trabalhos de upload podem conter apenas um arquivo) ao trabalho e altere qualquer um dos valores de propriedade conforme apropriado para seu aplicativo. Ao adicionar um arquivo ao trabalho, especifique o nome local (cliente) e remoto (servidor) do arquivo. O nome do arquivo remoto deve usar o protocolo HTTP, HTTPS ou SMB. Os arquivos dentro de um trabalho são processados sequencialmente (primeiro a entrar, primeiro a sair).
O BITS suspende automaticamente os trabalhos quando eles são criados. Você deve retomar o trabalho para ativá-lo na fila de transferência. Você pode suspender ou retomar um trabalho a qualquer momento. Retomar o trabalho move o trabalho do estado suspenso para o estado enfileirado. O trabalho permanece no estado em fila até que o agendador determine que é a vez do trabalho transferir arquivos. Todos os trabalhos em primeiro plano são executados simultaneamente com um trabalho em segundo plano. O BITS processa os arquivos em trabalhos de primeiro plano em série.
Quando é a vez de um trabalho transferir arquivos, o trabalho se move para o estado de conexão enquanto o BITS se conecta ao servidor remoto (especificado no nome do arquivo remoto). Se o BITS conseguir se conectar ao servidor remoto, o trabalho será movido para o estado de transferência, onde permanecerá até que sua fatia de tempo termine, a transferência seja concluída, ocorra um erro ou o aplicativo suspenda o trabalho.
O trabalho se move entre os estados enfileirado, de conexão e de transferência até que o BITS transfira todos os arquivos no trabalho. Nesse ponto, o trabalho se move para o estado transferido. O BITS usa o agendamento round-robin para agendar trabalhos que estão no mesmo nível de prioridade. Cada trabalho recebe uma fatia de tempo para processar seus arquivos. Se o trabalho não for concluído durante sua fatia de tempo, o trabalho voltará ao estado enfileirado e o próximo trabalho na fila será ativado. Isso evita que trabalhos grandes bloqueiem trabalhos menores. Os empregos são processados em grande parte em uma base de primeiro a entrar, primeiro a sair (FIFO); no entanto, o BITS não pode garantir o processamento FIFO devido ao agendamento de round-robin, erros de trabalho e reinicializações de serviço.
Os arquivos transferidos não estão disponíveis para o cliente até que o aplicativo chame o método IBackgroundCopyJob::Complete para transferir a propriedade dos arquivos do BITS para o usuário. Os trabalhos de carregamento também são definidos para o estado transferido quando o arquivo é recebido com êxito pelo servidor. Os trabalhos de upload-reply são definidos para o estado transferido depois que o arquivo é enviado com êxito para o servidor e a resposta do aplicativo do servidor é transferida com êxito para o cliente.
Se ocorrer um erro, o trabalho será movido para o estado de erro fatal ou transitório. Erros fatais são erros dos quais o BITS não pode se recuperar ou que exigem intervenção para corrigir. Se o aplicativo conseguir corrigir o erro, o aplicativo retomará o trabalho e o BITS moverá o trabalho para o estado em fila. Erros transitórios são erros que podem se resolver. O BITS tenta novamente trabalhos no estado de erro transitório até que a transferência seja bem-sucedida ou o trabalho atinja o tempo limite. O trabalho expira quando nenhum progresso é feito dentro de um período especificado pelo aplicativo. Se o trabalho atingir o tempo limite, o BITS moverá o trabalho para o estado de erro fatal.
Para obter mais informações sobre estados de trabalho, consulte BG_JOB_STATE.