如何处理取消的后台任务 (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 方法中,将 cancel 设置为 true

    完整的后台任务示例 OnCanceled 方法将 cancel 设置为 true

    function onCanceled(cancelSender, cancelReason) {
        cancel = true;
    }
    
  4. 在开始在后台任务中工作之前,请向“已取消的”事件侦听程序注册 OnCanceled 方法。

    例如,使用以下代码行:

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

相关主题

快速入门:创建和注册后台任务

如何注册后台任务

如何调试后台任务

使用后台任务支持应用

如何获取待完成后台任务的列表

如何监视后台任务进度和完成

如何在应用程序清单中声明后台任务

后台任务指南和清单