如何處理已取消的背景工作 (HTML)
[ 本文的目標對象是撰寫 Windows 執行階段 App 的 Windows 8.x 和 Windows Phone 8.x 開發人員。如果您正在開發適用於 Windows 10 的 App,請參閱 最新文件 ]
了解如何讓可辨識取消要求並停止工作的背景工作,使用背景工作執行個體和永續性儲存體報告應用程式的取消。
注意 就「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;
在步驟 1 所建立的 OnCanceled 方法中,將 cancel 設定為 true。
完整的背景工作範例 OnCanceled 方法會將 cancel 設為 true:
function onCanceled(cancelSender, cancelReason) { cancel = true; }
開始在背景工作中工作之前,先使用 "canceled" 事件接聽程式登錄 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);
})();