Como manipular uma tarefa em segundo plano cancelada (HTML)

[ Este artigo destina-se aos desenvolvedores do Windows 8.x e do Windows Phone 8.x que escrevem aplicativos do Windows Runtime. Se você estiver desenvolvendo para o Windows 10, consulte documentação mais recente]

Saiba como fazer uma tarefa em segundo plano que reconhece solicitações de cancelamento e interrompe o trabalho, relatando o cancelamento ao aplicativo usando a instância de tarefa em segundo plano e o armazenamento persistente.

Observação  Para aplicativos da Loja do Windows Phone, se o dispositivo ficar com pouca memória, as tarefas em segundo plano poderão ser encerradas sem qualquer aviso e sem gerar o evento OnCanceled. Isso ajuda a assegurar a experiência do usuário do aplicativo em primeiro plano. A tarefa em segundo plano deverá ser projetada para tratar desse cenário.

O que você precisa saber

Tecnologias

Pré-requisitos

Instruções

Etapa 1: Usar um manipulador de eventos para reconhecer as solicitações de cancelamento

Grave um método para manipular o evento de cancelamento.

  1. Crie um método denominado OnCanceled que tenha o seguinte volume de memória. Este método é o ponto de entrada chamado pelo Tempo de Execução do Windows sempre que uma solicitação de cancelamento é feita em relação a sua tarefa em segundo plano.

    A função OnCanceled precisa ter o seguinte volume de memória:

    
    function onCanceled(cancelSender, cancelReason)
    {
        // TODO: Add code to notify the background task that it is cancelled.
    }
    
  2. Adicione uma variável chamada cancel à tarefa em segundo plano. Isso será usado para indicar o recebimento da solicitação de cancelamento.

    Por exemplo, coloque esta linha de código na parte superior da classe IBackgroundTask, junto com outras definições de variável:

    var cancel = false;
    
  3. No método OnCanceled que você criou na etapa 1, defina cancel como true.

    O método OnCanceled completo do exemplo de tarefa em segundo plano define cancel como true:

    function onCanceled(cancelSender, cancelReason) {
        cancel = true;
    }
    
  4. Registre o método OnCanceled com o ouvinte de eventos "cancelado" antes de começar a trabalhar na tarefa em segundo plano.

    Por exemplo, use a seguinte linha de código:

    
    backgroundTaskInstance.addEventListener("canceled", onCanceled);
    

Etapa 2: Manipule o cancelamento e saia

O método Run precisa monitorar a variável cancel, para que possa sair quando a variável é definida como true.

  1. Modifique o código da classe da tarefa em segundo plano para parar de funcionar se cancel for definido como true.

    O exemplo de tarefa em segundo plano inclui uma verificação que interrompe o retorno de chamada do temporizador periódico quando a tarefa em segundo plano é cancelada:

    
    if (!cancel) {
        // Do work.
    }
    else
    {
        // Cancel.
    }
    
  2. Após a interrupção do trabalho, limpe tudo definindo a propriedade succeeded da instância da tarefa em segundo plano para false e registre que a tarefa foi cancelada. A chamada é fechada() para sair da função.

    O exemplo de tarefa em segundo plano registra o status em LocalSettings:

    
    if ((_cancelRequested == false) && (_progress < 100))
    {
        // See the background task sample for this code.
    }
    else
    {
        //
        // If the cancellation handler indicated that the task was canceled, stop the background task.
        //
        console.log("Background " + backgroundTaskInstance.task.name + " Canceled");
        backgroundTaskInstance.succeeded = false;
    
        key = backgroundTaskInstance.task.taskId.toString();
        settings.values[key] = "Canceled";
    
        close();
    }
    

Comentários

Você pode baixar a amostra de tarefa em segundo plano para ver esses exemplos de código contextualizados dentro de métodos.

Por questões ilustrativas, o código de exemplo acima mostra apenas partes da tarefa em segundo plano (e temporizador de chamada de retorno) do exemplo de tarefa em segundo plano.

Exemplo do método Run

A tarefa em segundo plano completa em JavaScript do exemplo de tarefa em segundo plano são mostrados a seguir para contextualização:

//
// A JavaScript background task runs a specified JavaScript file.
//
(function () {
    "use strict";

    //
    // The background task instance's activation parameters are available via Windows.UI.WebUI.WebUIBackgroundTaskInstance.current
    //
    var cancel = false,
        progress = 0,
        backgroundTaskInstance = Windows.UI.WebUI.WebUIBackgroundTaskInstance.current;

    console.log("Background " + backgroundTaskInstance.task.name + " Starting...");

    //
    // Associate a cancellation handler with the background task.
    //
    function onCanceled(cancelSender, cancelReason) {
        cancel = true;
    }
    backgroundTaskInstance.addEventListener("canceled", onCanceled);

    //
    // This function is set to run every 1000 milliseconds ten times and perform background task activity.
    //
    function onTimer() {
        var key = null,
            settings = Windows.Storage.ApplicationData.current.localSettings;

        if (!cancel) {
            if (progress < 100) {
                //
                // Simulate work being done.
                //
                setTimeout(onTimer, 1000);

                //
                // Indicate progress to the foreground application.
                //
                backgroundTaskInstance.progress = progress;
                progress += 10;
            } else {
                //
                // Use the succeeded property to indicate that this background task completed successfully.
                //
                backgroundTaskInstance.succeeded = true;
                backgroundTaskInstance.progress = progress;
                console.log("Background " + backgroundTaskInstance.task.name + " Completed");

                //
                // Write to localSettings to indicate that this background task completed.
                //
                key = backgroundTaskInstance.task.name;
                settings.values[key] = "Completed";

                //
                // A JavaScript background task must call close when it is done.
                //
                close();
            }
        } else {
            //
            // If the cancellation handler indicated that the task was canceled, stop the background task.
            //
            console.log("Background " + backgroundTaskInstance.task.name + " Canceled");
            backgroundTaskInstance.succeeded = false;

            key = backgroundTaskInstance.task.taskId.toString();
            settings.values[key] = "Canceled";

            close();
        }
    }

    //
    // Start the timer function to simulate background task work.
    //
    setTimeout(onTimer, 1000);
})();

Tópicos relacionados

Guia de início rápido: criar e registrar uma tarefa em segundo plano

Como registrar uma tarefa em segundo plano

Como depurar uma tarefa em segundo plano

Oferecendo suporte a tarefas em segundo plano em seu aplicativo

Como obter uma lista das tarefas em segundo plano pendentes

Como monitorar progresso e conclusão de tarefas em segundo plano

Como declarar tarefas em segundo plano no manifesto do aplicativo

Diretrizes e listas de verificação para tarefas em segundo plano