在計時器上執行背景工作

瞭解如何使用 TimeTrigger 安排僅執行一次的背景工作,或定期執行的背景工作。

請參閱背景啟用範例中的 Scenario4,查看本主題中所述的時間觸發背景工作的實作範例。

本主題假設您有背景工作需要定期執行,或在特定時間執行。 如果您還沒有背景工作,BackgroundActivity.cs 會有一個範例背景工作。 或者,請依照建立和註冊同處理序的背景工作建立及註冊跨處理序的背景工作中的步驟來建立。

建立時間觸發程序

建立新的 TimeTrigger。 第二個參數 OneShot 會指定背景工作只會執行一次或定期執行。 如果 OneShot 設定為 true,則第一個參數 (FreshnessTime) 會指定排程背景工作之前要等候的分鐘數。 如果 OneShot 設定為 false,FreshnessTime 會指定背景工作執行的頻率。

以桌上型電腦或行動裝置系列為目標之通用 Windows 平台 (UWP) 應用程式的內建定時器會以 15 分鐘為間隔執行背景工作。 (定時器每隔 15 分鐘執行一次,讓系統只需要每隔 15 分鐘喚醒一次,才能喚醒要求 TimerTriggers 的應用程式,以節省電源。)

  • 如果 FreshnessTime 設定為 15 分鐘且 OneShot 為 true,工作將會排定在從註冊時間開始的 15 到 30 分鐘之間執行一次。 如果 FreshnessTime 設定為 25 分鐘且 OneShot 為 true,工作將會排定在從註冊時間開始的 25 到 40 分鐘之間執行一次。

  • 如果 FreshnessTime 設定為 15 分鐘,而 OneShot 為 false,工作將會排定從註冊時間開始 15 到 30 分鐘之間,每隔 15 分鐘執行一次。 如果設定為 n 分鐘且 OneShot 為 false,工作將會排程從註冊時間開始 n 到 n + 15 分鐘之間,每隔 n 分鐘執行一次。

注意

如果 FreshnessTime 設定為小於 15 分鐘,嘗試註冊背景工作時會擲回例外狀況。

例如,此觸發程序會導致背景工作每小時執行一次。

TimeTrigger hourlyTrigger = new TimeTrigger(60, false);
Windows::ApplicationModel::Background::TimeTrigger hourlyTrigger{ 60, false };
TimeTrigger ^ hourlyTrigger = ref new TimeTrigger(60, false);

(選擇性) 新增條件

您可以建立背景工作條件,以控制工作何時執行。 條件可避免背景工作執行,直到符合條件為止。 如需詳細資訊,請參閱設定執行背景工作的條件

在這個範例中,條件會設定為 UserPresent,這樣一來,一旦觸發條件,工作只有在使用者作用中時才執行一次。 如需可能條件的清單,請參閱 SystemConditionType

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

如需有關背景觸發程序之條件和類型的詳細資訊,請參閱使用背景工作支援應用程式

呼叫 RequestAccessAsync()

註冊 ApplicationTrigger 背景工作之前,請呼叫 RequestAccessAsync 來判斷使用者允許的背景活動層級,因為使用者可能已停用應用程式的背景活動。 如需使用者控制背景活動設定方式的詳細資訊,請參閱最佳化背景活動

var requestStatus = await Windows.ApplicationModel.Background.BackgroundExecutionManager.RequestAccessAsync();
if (requestStatus != BackgroundAccessStatus.AlwaysAllowed)
{
    // Depending on the value of requestStatus, provide an appropriate response
    // such as notifying the user which functionality won't work as expected
}

登錄背景工作

呼叫背景工作註冊函式來註冊背景工作。 如需註冊背景工作的詳細資訊,以及若要在下列範例程式碼中查看 RegisterBackgroundTask() 方法的定義,請參閱註冊背景工作

重要

針對在與應用程式相同的處理序中執行的背景工作,請勿設定 entryPoint。 針對在與應用程式不同的處理序中執行的背景工作,請將 entryPoint 設定為 命名空間「.」,以及包含背景工作實作的類別名稱。

string entryPoint = "Tasks.ExampleBackgroundTaskClass";
string taskName   = "Example hourly background task";

BackgroundTaskRegistration task = RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition);
std::wstring entryPoint{ L"Tasks.ExampleBackgroundTaskClass" };
std::wstring taskName{ L"Example hourly background task" };

Windows::ApplicationModel::Background::BackgroundTaskRegistration task{
    RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition) };
String ^ entryPoint = "Tasks.ExampleBackgroundTaskClass";
String ^ taskName   = "Example hourly background task";

BackgroundTaskRegistration ^ task = RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition);

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

管理背景工作的資源

使用 BackgroundExecutionManager.RequestAccessAsync 來判斷使用者是否已決定您的應用程式背景活動應受到限制。 請注意您的電池使用量,且只有在需要完成使用者想要的動作時,才會在背景中執行。 如需使用者控制背景活動設定方式的詳細資訊,請參閱最佳化背景活動

  • 記憶體:調整應用程式的記憶體和使用電量是確保作業系統允許背景工作執行的關鍵。 使用記憶體管理 API 來查看背景工作所使用的記憶體存量。 背景工作所使用的記憶體越多,當另一個應用程式處於前景時,作業系統就越難讓它繼續執行。 使用者最終會控制應用程式可執行的所有背景活動,並能看見應用程式對電池使用電量的影響。
  • CPU 時間:背景工作受限於根據觸發程序類型取得的實際時間使用量。

如需套用至背景工作的資源限制,請參閱使用背景工作 支援應用程式

備註

從 Windows 10 開始,使用者不再需要將您的應用程式新增至鎖定畫面,才能利用背景工作。

如果您先呼叫 RequestAccessAsync,背景工作才會使用 TimeTrigger 執行。