Поделиться через


Обработка отмененной фоновой задачи (HTML)

[ Эта статья адресована разработчикам приложений среды выполнения Windows для Windows 8.x и Windows Phone 8.x. При разработке приложений для Windows 10 см. раздел последняя документация]

Узнайте, как создать фоновую задачу, которая распознает запросы на отмену, прекращает работу и сообщает приложению об отмене, используя экземпляр фоновой задачи и постоянное хранилище.

Примечание  Для универсальных приложений Windows Phone, если на устройстве не хватает памяти, можно завершить работу фоновых задач без предупреждения и создания события OnCanceled. Это позволяет не прерывать работу пользователя с активным приложением. Ваша фоновая задача должна поддерживать этот сценарий.

Что необходимо знать

Технологии

Необходимые условия

Инструкции

Этап 1: Использование обработчика событий для распознавания запросов на отмену

Напишите метод, который будет обрабатывать событие отмены.

  1. Создайте метод с именем OnCanceled, использующий следующий объем памяти. Этот метод — точка входа, вызываемая средой выполнения Windows при каждом создании запроса на отмену для вашей фоновой задачи.

    Функция OnCanceled должна использовать следующий объем памяти:

    
    function onCanceled(cancelSender, cancelReason)
    {
        // TODO: Add code to notify the background task that it is cancelled.
    }
    
  2. Добавьте переменную cancel в фоновую задачу. Она будет использоваться для указания на получение запроса на отмену.

    Например, поместите эту строку кода в верхнюю часть класса IBackgroundTask вместе с другими определениями переменных:

    var cancel = false;
    
  3. В методе OnCanceled, созданном на этапе 1, задайте переменной cancel значение true.

    В полном образце фоновой задачи метод OnCanceled задает переменной cancel значение true:

    function onCanceled(cancelSender, cancelReason) {
        cancel = true;
    }
    
  4. Перед началом работы в фоновой задаче зарегистрируйте метод OnCanceled с помощью прослушивателя событий "canceled".

    Например, используйте следующую строку кода:

    
    backgroundTaskInstance.addEventListener("canceled", onCanceled);
    

Этап 2: Обработка отмены и выход

В методе Run необходимо отслеживать переменную cancel, чтобы можно было выполнить выход, когда переменная получает значение true.

  1. Измените код класса своей фоновой задачи, чтобы остановить работу, когда переменной cancel присваивается значение true.

    Образец фоновой задачи содержит проверку, которая останавливает периодический обратный вызов таймера, если фоновая задача отменена:

    
    if (!cancel) {
        // Do work.
    }
    else
    {
        // Cancel.
    }
    
  2. После остановки работы выполните очистку, задав свойству succeeded данного экземпляра фоновой задачи значение false, и сделайте запись об отмене задачи. Вызовите close() для выхода из функции.

    В образце фоновой задачи состояние записывается в 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();
    }
    

Замечания

Вы можете скачать образец фоновой задачи, чтобы увидеть эти примеры кода в контексте методов.

Для наглядности в примере кода выше показана лишь часть фоновой задачи (и обратного вызова таймера) из данного образца фоновой задачи.

Пример метода Run

Целиком фоновая задача на JavaScript из образца фоновой задачи приведена ниже для контекста:

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

Связанные разделы

Краткое руководство: создание и регистрация фоновой задачи

Регистрация фоновой задачи

Отладка фоновой задачи

Поддержка приложения с помощью фоновых задач

Получение списка отложенных фоновых задач

Отслеживание хода выполнения и завершения фоновых задач

Объявление фоновых задач в манифесте приложения

Руководство и контрольный список для фоновых задач