Windows Dev Center

Idioma: HTML | XAML

Como resolver tarefas em segundo plano ociosas ou suspensas

Tarefas em segundo plano ociosas podem terminar o aplicativo desnecessariamente. Para resolver tarefas em segundo plano ociosas (ou suspensas), cancele e saia totalmente da tarefa.

As tarefas em segundo plano devem ser de curta duração, executando e concluindo seu trabalho rapidamente. Esse comportamento é necessário por causa das limitações restritas de recurso de rede e CPU para as tarefas em segundo plano. Essas tarefas são a única forma permitida de execução de código em segundo plano quando o aplicativo está suspenso e durante o Modo de Espera Conectado. As limitações de uso dos recursos são impostas para reduzir o impacto que as tarefas em segundo plano podem ter sobre a vida útil da bateria.

Para impor essas limitações, a infraestrutura da tarefa em segundo plano detecta as tarefas desse tipo que estão ociosas ou que pararam de responder. Quando a tarefa em segundo plano não utiliza uma quantidade mínima de cota de CPU ou de recurso de rede em um período mínimo de tempo, ela é considerada ociosa ou suspensa. O tempo mínimo varia de acordo com o estado do sistema; por exemplo, quando está no Modo de Espera Conectado. Ao ser detectada, a tarefa em segundo plano ociosa ou suspensa recebe uma notificação de cancelamento, permitindo que ela seja finalizada corretamente. Se, em resposta à notificação de cancelamento, a tarefa em segundo plano não sair completamente em até cinco segundos, o aplicativo entenderá que a tarefa não pode responder e a finalizará. (Observe que isso gerará um relatório de despejo de memória WER, que ficará disponível na sua conta de desenvolvedor da Windows Store.)

Normalmente, as tarefas em segundo plano ficam ociosas ou são suspensas enquanto aguardam o retorno de uma operação assíncrona no método Run(). Por exemplo, durante a espera por uma resposta em um soquete de rede ou por uma operação de cópia de um arquivo grande quando o disco para de responder. Siga estas etapas para realizar corretamente o cancelamento da tarefa em segundo plano mesmo durante a espera de operações assíncronas.

O que você precisa saber

Tecnologias

Pré-requisitos

  • Este tópico trata de aplicativos com tarefas em segundo plano.

Instruções

Etapa 1: Registrar um manipulador de cancelamento

Registre sempre um manipulador de cancelamento para a sua tarefa em segundo plano. Quando o sistema detecta uma tarefa em segundo plano ociosa ou suspensa, ele chama o manipulador de cancelamento. Sua tarefa em segundo plano precisa ter um manipulador de cancelamento, que tem de fazer com que a tarefa seja encerrada completamente dentro de cinco segundos; do contrário, o aplicativo é terminado.

Etapa 2: Cancelar operações assíncronas

Algumas tarefas parecem ociosas enquanto esperam pelas operações assíncronas criadas no método Run(). Uma forma simples de cancelar todas as operações assíncronas pendentes é associar um CancellationTokenSource a todas as suas operações assíncronas. Depois, no manipulador de cancelamento, basta chamar o cancelamento no CancellationTokenSource para cancelar todas as operações assíncronas pendentes.

Etapa 3: Concluir o adiamento da tarefa em segundo plano

Em C#/C++/VB, a tarefa em segundo plano sempre tem de chamar Complete() em seu objeto de adiamento após o término de seu trabalho para ser desligada. Sem chamar Complete() no adiamento, a tarefa em segundo plano não é encerrada, sua infraestrutura detecta quando ela se torna ociosa e envia uma notificação de cancelamento para ela.

Comentários

Práticas recomendadas para tarefas em segundo plano ociosas ou suspensas

Siga estas práticas recomendadas para tarefas em segundo plano ociosas ou suspensas.

  1. Associe sempre um manipulador de cancelamento a suas tarefas em segundo plano.
  2. No manipulador de cancelamento, cancele todas as operações assíncronas e retorne em cinco segundos; do contrário, o aplicativo é terminado.
  3. Chame sempre Complete() no objeto de adiamento um pouco antes do encerramento da tarefa em segundo plano em C#/C++/VB.

Código de exemplo

A seguinte tarefa em segundo plano registra um manipulador de cancelamento, cancela as operações assíncronas e chama Complete().


public sealed class ExampleClass:IBackgroundTask
{
    CancellationTokenSource cancelTokenSource = new CancellationTokenSource();

    async void Run(IBackgroundTaskInstance taskInstance)
    {
        BackgroundTaskDeferral deferral = taskInstance.GetDeferral();
        HostName server = new HostName("contoso.com");
        StreamSocket sock = new StreamSocket();
        
        // Skipping other extraneous code.
        
        // Associate a cancellation handler with the background task.
        taskInstance.Canceled += new BackgroundTaskCanceledEventHandler(OnCanceled);

        try
        {    
            await sock.ConnectAsync(server, "http").AsTask(cancelTokenSource.Token);
            await sock.InputStream.ReadAsync(…).AsTask(cancelTokenSource.Token);                   
        }
        finally { deferral.Complete(); }
    }
    

    private void OnCanceled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason)
    {
        // The background task has been detected as idle or hung.
        // Cancel all pending async operations and return from the task.
        cancelTokenSource.Cancel(); 
    }
}


Tópicos relacionados

O que fazer com uma tarefa em segundo plano cancelada

 

 

Mostrar:
© 2015 Microsoft