註冊背景工作

重要 API

了解如何建立可重複用來安全登錄大多數背景工作的函式。

本主題適用於同處理序背景工作和跨處理序背景工作。 本主題假設您已經有需要註冊的背景工作。 (請參閱 建立並註冊跨處理序執行的背景工作,或建立並註冊同處理序執行的背景工作 ,以取得如何撰寫背景工作的相關資訊)。

本主題會逐步解說註冊背景工作的公用程式函式。 此公用程式函式會先檢查現有註冊,再多次註冊工作,以避免發生多個註冊的問題,而且可以將系統條件套用至背景工作。 本逐步解說包含此公用程式函式的完整實用範例。

注意  

通用 Windows 平台應用程式註冊任何背景觸發程序類型之前,必須呼叫 RequestAccessAsync

為了確保通用 Windows 應用程式在您發行應用程式更新之後繼續正常執行,您必須呼叫 RemoveAccess,然後在應用程式更新後啟動時呼叫 RequestAccessAsync。 如需詳細資訊,請參閱背景任務指南

定義方法簽章和傳回類型

此方法會採用工作進入點、工作名稱、預先建構的背景工作觸發程序,以及 (選擇性) 背景工作的 SystemCondition。 這個方法會傳回 BackgroundTaskRegistration 物件。

重要

taskEntryPoint - 對於跨處理序執行的背景工作,這必須建構為命名空間名稱「.」,以及包含背景類別的類別名稱。 此字串區分大小寫。 例如,如果您有「MyBackgroundTasks」命名空間和包含背景類別程式碼的「BackgroundTask1」類別,則 taskEntryPoint 的 字串會是「MyBackgroundTasks.BackgroundTask1」。 如果您的背景工作在與應用程式相同的處理序中執行 (也就是同處理序背景工作),則不應該設定 taskEntryPoint

public static BackgroundTaskRegistration RegisterBackgroundTask(
                                                string taskEntryPoint,
                                                string name,
                                                IBackgroundTrigger trigger,
                                                IBackgroundCondition condition)
{
    
    // We'll add code to this function in subsequent steps.

}
BackgroundTaskRegistration^ MainPage::RegisterBackgroundTask(
                                             Platform::String ^ taskEntryPoint,
                                             Platform::String ^ taskName,
                                             IBackgroundTrigger ^ trigger,
                                             IBackgroundCondition ^ condition)
{
    
    // We'll add code to this function in subsequent steps.

}

檢查是否有現有的註冊

檢查工作是否已註冊。 請務必檢查此情況,因為如果多次註冊工作,每次觸發工作時都會執行多次;這可能會使用過多的 CPU 資源並導致非預期的行為。

您可以查詢 BackgroundTaskRegistration.AllTasks 屬性並逐一查看結果,以檢查現有的註冊。 檢查每個執行個體的名稱 – 如果它符合您要註冊的工作名稱,請中斷迴圈並設定旗標變數,讓您的程式碼在下一個步驟中選擇不同的路徑。

注意 使用應用程式唯一的背景工作名稱。 確定每個背景工作都有唯一的名稱。

下列程式碼會使用我們在最後一個步驟中建立的 SystemTrigger 註冊背景工作:

public static BackgroundTaskRegistration RegisterBackgroundTask(
                                                string taskEntryPoint,
                                                string name,
                                                IBackgroundTrigger trigger,
                                                IBackgroundCondition condition)
{
    //
    // Check for existing registrations of this background task.
    //

    foreach (var cur in BackgroundTaskRegistration.AllTasks)
    {

        if (cur.Value.Name == name)
        {
            //
            // The task is already registered.
            //

            return (BackgroundTaskRegistration)(cur.Value);
        }
    }
    
    // We'll register the task in the next step.
}
BackgroundTaskRegistration^ MainPage::RegisterBackgroundTask(
                                             Platform::String ^ taskEntryPoint,
                                             Platform::String ^ taskName,
                                             IBackgroundTrigger ^ trigger,
                                             IBackgroundCondition ^ condition)
{
    //
    // Check for existing registrations of this background task.
    //
    
    auto iter   = BackgroundTaskRegistration::AllTasks->First();
    auto hascur = iter->HasCurrent;
    
    while (hascur)
    {
        auto cur = iter->Current->Value;
        
        if(cur->Name == name)
        {
            //
            // The task is registered.
            //
            
            return (BackgroundTaskRegistration ^)(cur);
        }
        
        hascur = iter->MoveNext();
    }
    
    // We'll register the task in the next step.
}

註冊背景工作 (或傳回現有的註冊)

檢查在現有背景工作註冊清單中是否找到此工作。 如果是,請傳回工作的執行個體。

然後,使用新的 BackgroundTaskBuilder 物件註冊工作。 此程式碼應該檢查條件參數是否為 Null,如果不是,請將條件新增至註冊物件。 傳回 BackgroundTaskBuilder.Register 方法所傳回的 BackgroundTaskRegistration

注意 註冊時會驗證背景工作註冊參數。 如果任何註冊參數無效,則會傳回錯誤。 請確定您的應用程式可正常處理背景工作註冊失敗的案例,如果您的應用程式在嘗試註冊工作之後依賴有效的註冊物件,它可能會當機。 注意 如果您要註冊在與應用程式相同的處理序中執行的背景工作,請傳送 String.Emptynull 做為 taskEntryPoint 參數。

下列範例會傳回現有的工作,或新增程式碼來註冊背景工作 (如果存在,包括選擇性的系統條件):

public static BackgroundTaskRegistration RegisterBackgroundTask(
                                                string taskEntryPoint,
                                                string name,
                                                IBackgroundTrigger trigger,
                                                IBackgroundCondition condition)
{
    //
    // Check for existing registrations of this background task.
    //

    foreach (var cur in BackgroundTaskRegistration.AllTasks)
    {

        if (cur.Value.Name == taskName)
        {
            //
            // The task is already registered.
            //

            return (BackgroundTaskRegistration)(cur.Value);
        }
    }

    //
    // Register the background task.
    //

    var builder = new BackgroundTaskBuilder();

    builder.Name = name;

    // in-process background tasks don't set TaskEntryPoint
    if ( taskEntryPoint != null && taskEntryPoint != String.Empty)
    {
        builder.TaskEntryPoint = taskEntryPoint;
    }
    builder.SetTrigger(trigger);

    if (condition != null)
    {
        builder.AddCondition(condition);
    }

    BackgroundTaskRegistration task = builder.Register();

    return task;
}
BackgroundTaskRegistration^ MainPage::RegisterBackgroundTask(
                                             Platform::String ^ taskEntryPoint,
                                             Platform::String ^ taskName,
                                             IBackgroundTrigger ^ trigger,
                                             IBackgroundCondition ^ condition)
{

    //
    // Check for existing registrations of this background task.
    //

    auto iter   = BackgroundTaskRegistration::AllTasks->First();
    auto hascur = iter->HasCurrent;

    while (hascur)
    {
        auto cur = iter->Current->Value;

        if(cur->Name == name)
        {
            //
            // The task is registered.
            //

            return (BackgroundTaskRegistration ^)(cur);
        }

        hascur = iter->MoveNext();
    }

    //
    // Register the background task.
    //

    auto builder = ref new BackgroundTaskBuilder();

    builder->Name = name;
    builder->TaskEntryPoint = taskEntryPoint;
    builder->SetTrigger(trigger);

    if (condition != nullptr) {
        
        builder->AddCondition(condition);
    }

    BackgroundTaskRegistration ^ task = builder->Register();

    return task;
}

完成背景工作註冊公用程式函式

此範例顯示已完成的背景工作註冊函式。 此函式可用來註冊大部分的背景工作,但網路背景工作除外。

//
// Register a background task with the specified taskEntryPoint, name, trigger,
// and condition (optional).
//
// taskEntryPoint: Task entry point for the background task.
// taskName: A name for the background task.
// trigger: The trigger for the background task.
// condition: Optional parameter. A conditional event that must be true for the task to fire.
//
public static BackgroundTaskRegistration RegisterBackgroundTask(string taskEntryPoint,
                                                                string taskName,
                                                                IBackgroundTrigger trigger,
                                                                IBackgroundCondition condition)
{
    //
    // Check for existing registrations of this background task.
    //

    foreach (var cur in BackgroundTaskRegistration.AllTasks)
    {

        if (cur.Value.Name == taskName)
        {
            //
            // The task is already registered.
            //

            return (BackgroundTaskRegistration)(cur.Value);
        }
    }

    //
    // Register the background task.
    //

    var builder = new BackgroundTaskBuilder();

    builder.Name = taskName;
    builder.TaskEntryPoint = taskEntryPoint;
    builder.SetTrigger(trigger);

    if (condition != null)
    {

        builder.AddCondition(condition);
    }

    BackgroundTaskRegistration task = builder.Register();

    return task;
}
//
// Register a background task with the specified taskEntryPoint, name, trigger,
// and condition (optional).
//
// taskEntryPoint: Task entry point for the background task.
// taskName: A name for the background task.
// trigger: The trigger for the background task.
// condition: Optional parameter. A conditional event that must be true for the task to fire.
//
BackgroundTaskRegistration^ MainPage::RegisterBackgroundTask(Platform::String ^ taskEntryPoint,
                                                             Platform::String ^ taskName,
                                                             IBackgroundTrigger ^ trigger,
                                                             IBackgroundCondition ^ condition)
{

    //
    // Check for existing registrations of this background task.
    //

    auto iter   = BackgroundTaskRegistration::AllTasks->First();
    auto hascur = iter->HasCurrent;

    while (hascur)
    {
        auto cur = iter->Current->Value;

        if(cur->Name == name)
        {
            //
            // The task is registered.
            //

            return (BackgroundTaskRegistration ^)(cur);
        }

        hascur = iter->MoveNext();
    }


    //
    // Register the background task.
    //

    auto builder = ref new BackgroundTaskBuilder();

    builder->Name = name;
    builder->TaskEntryPoint = taskEntryPoint;
    builder->SetTrigger(trigger);

    if (condition != nullptr) {

        builder->AddCondition(condition);
    }

    BackgroundTaskRegistration ^ task = builder->Register();

    return task;
}