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
- Este tópico pressupõe que você já criou uma tarefa JavaScript em segundo plano. Para começar a criar rapidamente uma tarefa em segundo plano, veja Início rápido: criar e registrar uma tarefa em segundo plano. Para saber mais sobre condições e disparadores, veja Oferecendo suporte a tarefas em segundo plano em seu aplicativo.
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.
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. }
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;
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; }
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.
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. }
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