設定執行背景工作的條件

重要 API

了解如何設定條件以控制背景工作的執行時間。

有時候,背景工作需要符合特定條件,背景工作才能成功。 註冊背景工作時,您可以指定 SystemConditionType 所指定的一或多個條件。 觸發程序引發之後,將會檢查條件。 背景工作接著會排入佇列,但在滿足所有必要的條件之後,才會執行。

在背景工作放入條件,可防止工作不必要地執行,來節省電池使用時間和 CPU。 例如,如果您的背景工作在定時器上執行,而且需要網際網路連線,請在註冊工作之前,將 InternetAvailable 條件新增至 TaskBuilder。 這將有助於防止工作不必要地使用系統資源和電池,只有在計時器已經到期網際網路可用時才執行背景工作。

您也可以在同一個 TaskBuilder 上多次呼叫 AddCondition 來結合多個條件。 請小心不要新增衝突的條件,例如 UserPresentUserNotPresent

建立 SystemCondition 物件

本主題假設您已有與應用程式相關聯的背景工作,而且您的應用程式已經包含建立名為 taskBuilderBackgroundTaskBuilder 物件的程式碼。 如果您需要先建立背景工作,請參閱建立及註冊同處理序的背景工作建立及註冊跨處理序的背景工作

本主題適用於跨處理序執行的背景工作,以及與前景應用程式在相同處理序中執行的背景工作。

新增條件之前,請先建立 SystemCondition 物件來代表必須生效才能執行背景工作的條件。 在建構函式中,指定必須符合 SystemConditionType 列舉值的條件。

下列程式碼會建立指定 InternetAvailable 條件的 SystemCondition 物件:

SystemCondition internetCondition = new SystemCondition(SystemConditionType.InternetAvailable);
Windows::ApplicationModel::Background::SystemCondition internetCondition{
    Windows::ApplicationModel::Background::SystemConditionType::InternetAvailable };
SystemCondition ^ internetCondition = ref new SystemCondition(SystemConditionType::InternetAvailable);

將 SystemCondition 物件新增至背景工作

若要新增條件,請在 BackgroundTaskBuilder 物件上呼叫 AddCondition 方法,並傳遞 SystemCondition 物件。

下列程式碼會使用 taskBuilder 來新增 InternetAvailable 條件。

taskBuilder.AddCondition(internetCondition);
taskBuilder.AddCondition(internetCondition);
taskBuilder->AddCondition(internetCondition);

註冊背景工作

現在您可以使用 Register 方法註冊背景工作,而且背景工作在符合指定條件之前將不會啟動。

下列程式碼會註冊工作,並儲存產生的 BackgroundTaskRegistration 物件:

BackgroundTaskRegistration task = taskBuilder.Register();
Windows::ApplicationModel::Background::BackgroundTaskRegistration task{ recurringTaskBuilder.Register() };
BackgroundTaskRegistration ^ task = taskBuilder->Register();

注意

註冊時會驗證背景工作註冊參數。 如果任何註冊參數無效,則會傳回錯誤。 請確定您的應用程式可正常處理背景工作註冊失敗的案例,如果您的應用程式在嘗試註冊工作之後依賴有效的註冊物件,它可能會當機。

在背景工作上放置多個條件

若要新增多個條件,您的應用程式會多次 呼叫 AddCondition 方法。 這些呼叫必須在工作註冊生效之前進行。

注意

請小心不要將衝突的條件新增至背景工作。

下列程式碼片段顯示建立和註冊背景工作內容中的多個條件。

// Set up the background task.
TimeTrigger hourlyTrigger = new TimeTrigger(60, false);

var recurringTaskBuilder = new BackgroundTaskBuilder();

recurringTaskBuilder.Name           = "Hourly background task";
recurringTaskBuilder.TaskEntryPoint = "Tasks.ExampleBackgroundTaskClass";
recurringTaskBuilder.SetTrigger(hourlyTrigger);

// Begin adding conditions.
SystemCondition userCondition     = new SystemCondition(SystemConditionType.UserPresent);
SystemCondition internetCondition = new SystemCondition(SystemConditionType.InternetAvailable);

recurringTaskBuilder.AddCondition(userCondition);
recurringTaskBuilder.AddCondition(internetCondition);

// Done adding conditions, now register the background task.

BackgroundTaskRegistration task = recurringTaskBuilder.Register();
// Set up the background task.
Windows::ApplicationModel::Background::TimeTrigger hourlyTrigger{ 60, false };

Windows::ApplicationModel::Background::BackgroundTaskBuilder recurringTaskBuilder;

recurringTaskBuilder.Name(L"Hourly background task");
recurringTaskBuilder.TaskEntryPoint(L"Tasks.ExampleBackgroundTaskClass");
recurringTaskBuilder.SetTrigger(hourlyTrigger);

// Begin adding conditions.
Windows::ApplicationModel::Background::SystemCondition userCondition{
    Windows::ApplicationModel::Background::SystemConditionType::UserPresent };
Windows::ApplicationModel::Background::SystemCondition internetCondition{
    Windows::ApplicationModel::Background::SystemConditionType::InternetAvailable };

recurringTaskBuilder.AddCondition(userCondition);
recurringTaskBuilder.AddCondition(internetCondition);

// Done adding conditions, now register the background task.
Windows::ApplicationModel::Background::BackgroundTaskRegistration task{ recurringTaskBuilder.Register() };
// Set up the background task.
TimeTrigger ^ hourlyTrigger = ref new TimeTrigger(60, false);

auto recurringTaskBuilder = ref new BackgroundTaskBuilder();

recurringTaskBuilder->Name           = "Hourly background task";
recurringTaskBuilder->TaskEntryPoint = "Tasks.ExampleBackgroundTaskClass";
recurringTaskBuilder->SetTrigger(hourlyTrigger);

// Begin adding conditions.
SystemCondition ^ userCondition     = ref new SystemCondition(SystemConditionType::UserPresent);
SystemCondition ^ internetCondition = ref new SystemCondition(SystemConditionType::InternetAvailable);

recurringTaskBuilder->AddCondition(userCondition);
recurringTaskBuilder->AddCondition(internetCondition);

// Done adding conditions, now register the background task.
BackgroundTaskRegistration ^ task = recurringTaskBuilder->Register();

備註

注意

選擇背景工作的條件,使其只在需要時執行,並且在不應該執行時不執行。 如需不同背景工作條件的描述,請參閱 SystemConditionType