Cómo administrar una tarea en segundo plano cancelada (HTML)

[ Este artículo está destinado a desarrolladores de Windows 8.x y Windows Phone 8.x que escriben aplicaciones de Windows en tiempo de ejecución. Si estás desarrollando para Windows 10, consulta la documentación más reciente

Aprende a crear una tarea en segundo plano que reconozca solicitudes de cancelación y detenga el trabajo, y que informe de la cancelación a la aplicación a través de la instancia de tarea en segundo plano y el almacenamiento persistente.

Nota  En el caso de las aplicaciones de la Tienda de Windows Phone, si el dispositivo se empieza a quedar sin memoria, es posible que las tareas en segundo plano finalicen sin advertencia previa y sin generar el evento OnCanceled. Esto contribuye a garantizar la experiencia del usuario de la aplicación en primer plano. La tarea en segundo plano debe estar diseñada para controlar este escenario.

Lo que debes saber

Tecnologías

Requisitos previos

Instrucciones

Paso 1: Usar un controlador de eventos para reconocer las solicitudes de cancelación

Escribe un método para controlar el evento de cancelación.

  1. Crea un método llamado OnCanceled que tenga la siguiente superficie. Este método es el punto de entrada al que llama Windows en tiempo de ejecución siempre que se realiza una solicitud de cancelación contra tu tarea en segundo plano.

    La función OnCanceled necesita tener la siguiente superficie:

    
    function onCanceled(cancelSender, cancelReason)
    {
        // TODO: Add code to notify the background task that it is cancelled.
    }
    
  2. Agrega una variable llamada cancel a la tarea en segundo plano. Esta se usará para indicar la recepción de una solicitud de cancelación.

    Por ejemplo, coloca esta línea de código al principio de tu clase IBackgroundTask, junto con otras definiciones de variables:

    var cancel = false;
    
  3. En el método OnCanceled que creaste en el paso 1, establece cancel en true.

    El método OnCanceled completo de la muestra de tarea en segundo plano establece cancel en true:

    function onCanceled(cancelSender, cancelReason) {
        cancel = true;
    }
    
  4. Registra el método OnCanceled con la escucha de eventos "canceled" antes de empezar a trabajar en la tarea en segundo plano.

    Por ejemplo, usa la siguiente línea de código:

    
    backgroundTaskInstance.addEventListener("canceled", onCanceled);
    

Paso 2: Controlar la cancelación y salir

El método Run necesita supervisar la variable cancel, de forma que pueda salir cuando la variable se establezca en true.

  1. Modifica el código de la clase de tu tarea en segundo plano para que deje de funcionar si cancel está establecido en true.

    La muestra de tarea en segundo plano incluye una comprobación que detiene la devolución de llamada periódica al temporizador si se cancela la tarea en segundo plano:

    
    if (!cancel) {
        // Do work.
    }
    else
    {
        // Cancel.
    }
    
  2. Cuando se detenga el trabajo, establece la propiedad succeeded de la instancia de tarea en segundo plano en false para la limpieza y registra que la tarea se canceló. La llamada se cierra() para salir de la función.

    La muestra de tarea en segundo plano registra el estado en 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();
    }
    

Observaciones

Puedes descargar la muestra de tarea en segundo plano para ver estas muestras de código en contexto dentro de los métodos.

Por propósitos de ilustración, el código de muestra anterior solo muestra algunas partes de la tarea en segundo plano (y temporizador de devolución de llamadas) de la muestra de tarea en segundo plano.

Ejemplo de método Run

La tarea completa en segundo plano con JavaScript, de la muestra de tarea en segundo plano, se presenta a continuación para tengas el contexto:

//
// 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);
})();

Temas relacionados

Inicio rápido: creación y registro de una tarea en segundo plano

Cómo registrar una tarea en segundo plano

Cómo depurar una tarea en segundo plano

Dar soporte a tu aplicación mediante tareas en segundo plano

Cómo obtener una lista de tareas en segundo plano pendientes

Cómo supervisar el progreso y la finalización de tareas en segundo plano

Cómo declarar tareas en segundo plano en el manifiesto de la aplicación

Directrices y listas de comprobación para tareas en segundo plano