共用方式為


如何處理已取消的背景工作 (HTML)

[ 本文的目標對象是撰寫 Windows 執行階段 App 的 Windows 8.x 和 Windows Phone 8.x 開發人員。如果您正在開發適用於 Windows 10 的 App,請參閱 最新文件 ]

了解如何讓可辨識取消要求並停止工作的背景工作,使用背景工作執行個體和永續性儲存體報告應用程式的取消。

注意  就「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. 在步驟 1 所建立的 OnCanceled 方法中,將 cancel 設定為 true

    完整的背景工作範例 OnCanceled 方法會將 cancel 設為 true

    function onCanceled(cancelSender, cancelReason) {
        cancel = true;
    }
    
  4. 開始在背景工作中工作之前,先使用 "canceled" 事件接聽程式登錄 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);
})();

相關主題

快速入門:建立並登錄背景工作

如何登錄背景工作

如何偵錯背景工作

使用背景工作支援 app

如何取得擱置中的背景工作清單

如何監視背景工作進度和完成

如何在應用程式資訊清單中宣告背景工作

背景工作的指導方針和檢查清單