如何处理取消的后台任务 (HTML)
[ 本文适用于编写 Windows 运行时应用的 Windows 8.x 和 Windows Phone 8.x 开发人员。如果你要针对 Windows 10 进行开发,请参阅 最新文档 ]
介绍如何创建一个后台任务,该任务识别取消请求并停止工作,向使用后台任务实例和永久性存储的应用报告取消。
注意 对于 Windows Phone 应用商店应用,如果设备内存不足,后台任务将在没有任何警告且不引发 OnCanceled 事件的情况下终止。这有助于确保前台中应用的用户体验。应该将后台任务设计为处理此方案。
你需要了解的内容
技术
先决条件
- 本主题假定你已经创建了一个 JavaScript 后台任务。若要快速构建后台任务,请阅读快速入门:创建和注册后台任务。有关条件和触发器的详细信息,请参阅使用后台任务支持应用。
说明
步骤 1: 使用事件处理程序识别取消请求
编写一个用于处理取消事件的方法。
创建一个名为 OnCanceled 的方法,该方法具有以下足迹。该方法是 Windows 运行时在针对后台任务进行取消请求时调用的入口点。
OnCanceled 函数需要具有以下内存占用:
function onCanceled(cancelSender, cancelReason) { // TODO: Add code to notify the background task that it is cancelled. }
将一个称为 cancel 的变量添加到后台任务。这将用于指示何时收到取消请求。
例如,将该行代码放置在 IBackgroundTask 类的上面,和其他变量定义放在一起:
var cancel = false;
在第一步中创建的 OnCanceled 方法中,将 cancel 设置为 true。
完整的后台任务示例 OnCanceled 方法将 cancel 设置为 true:
function onCanceled(cancelSender, cancelReason) { cancel = true; }
在开始在后台任务中工作之前,请向“已取消的”事件侦听程序注册 OnCanceled 方法。
例如,使用以下代码行:
backgroundTaskInstance.addEventListener("canceled", onCanceled);
步骤 2: 处理取消并退出
Run 方法需要监视 cancel 变量,这样将该变量设置为 true 时,该方法可能会退出。
修改后台任务类的代码以在将 cancel 设置为 true 时停止工作。
后台任务示例包含一个检查,该检查在后台任务取消时停止定期计时器回调。
if (!cancel) { // Do work. } else { // Cancel. }
停止工作之后,通过将后台任务实例的 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);
})();