背景工作的指導方針

確保您的應用程式符合執行背景工作的需求。

背景工作指引

在開發背景工作時以及發布應用程式之前,請考慮以下指南。

如果您使用背景工作在背景播放媒體,請參閱在背景播放媒體,以取得 Windows 10 版本 1607 改善的相關資訊,讓媒體更容易。

程序內與程序外背景工作:Windows 10 版本 1607 引入了程序內背景工作,它允許您在與前景應用程式相同的程序中執行背景程式碼。 決定是否要有跨程序背景工作與跨程序背景工作時,請考慮下列因素:

考量事項 影響
復原能力 如果您的背景程序在另一個程序中執行,背景處理程式中的當機將不會關閉前景應用程式。 此外,如果背景活動執行超過執行時間限制,即使在您的應用程式內也可以終止。 當前景和背景程序不需要相互通訊時,將背景工作分離為與前景應用程式分開的工作可能是更好的選擇 (因為程序內背景工作的主要優點之一是它們消除了程序間通訊的需要)。
簡單 程序內背景工作不需要跨程序通訊,而且撰寫較不複雜。
可用的觸發程序 程序內背景工作不支援下列觸發程序:DeviceUseTriggerDeviceServicingTriggerIoTStartupTask
VoIP 程序背景工作不支援在應用程式中啟用 VoIP 背景工作。

觸發程序執行個體數目的限制:應用程式可以註冊的某些觸發程序執行個體有數目限制。 每個應用程式執行個體只能註冊 ApplicationTriggerMediaProcessingTriggerDeviceUseTrigger。 如果應用程式超過此限制,註冊將會擲回例外狀況。

CPU 配額:背景工作受限於根據觸發程序類型取得的實際時間使用量。 大部分的觸發程序限制為 30 秒的時鐘使用,而有些觸發程序可以執行最多 10 分鐘,才能完成密集的工作。 背景工作應該是輕量型,可節省電池使用時間,併為前景應用程式提供更好的用戶體驗。 如需套用至背景工作的資源限制,請參閱使用背景工作 支援應用程式

管理背景工作:您的應用程式應該取得已註冊的背景工作清單、註冊進度和完成處理程式,以及適當地處理這些事件。 您的背景工作類別應該報告進度、取消和完成。 如需詳細資訊,請參閱處理已取消的背景工作,以及監視背景工作進度和完成

使用 BackgroundTaskDeferral如果您的背景工作類別執行異步程式代碼,請務必使用延遲。 否則,當 Run 方法返回時 (或在程序內背景工作的情況下為 OnBackgroundActivated 方法),您的背景工作可能會提前終止。 如需更多資訊,請參閱建立及註冊跨處理序的背景工作

或者,要求一個延遲,並使用 async/await 來完成異步方法呼叫。 呼叫 await 方法後關閉延遲。

更新應用程式指令清單:針對執行跨程序的背景工作,請在應用程式指令清單中宣告每個背景工作,以及它所使用的觸發程序類型。 否則,您的應用程式將無法在執行時間註冊背景工作。

如果您有多個背景工作,請考慮它們是否應該在同一個主機程序中執行,或分為不同的主機程序。 如果您擔心一個背景工作的失敗可能會導致其他背景工作崩潰,請將它們放在單獨的主機程序中。 使用清單設計器中的資源群組項目將背景工作分組到不同的主機程序。

若要設定資源群組,請開啟 Package.appxmanifest 設計器,選擇聲明,然後新增應用程式服務聲明:

Resource group setting

有關資源組設定的更多資訊,請參閱應用程式架構參考

與前景應用程式在同一程序中執行的背景工作不需要在應用程式清單中聲明自己。 如需在指令清單中宣告跨程序之背景工作的詳細資訊,請參閱在應用程式指令清單中宣告背景工作

準備應用程式更新:如果您的應用程式將要更新,請建立並註冊 ServicingComplete 背景工作 (請參閱 SystemTriggerType) 以取消註冊應用程式先前版本的背景工作,並註冊新版本的背景工作。 這也是執行在前景執行的上下文之外可能需要的應用程式更新的適當時間。

執行背景工作的要求:

重要從 Windows 10 開始,應用程式不再需要位於鎖定畫面上作為執行背景工作的先決條件。

通用 Windows 平台 (UWP) 應用程式可以執行所有支援的工作類型,而無需固定到鎖定畫面。 不過,應用程式必須呼叫 GetAccessState,並確認應用程式不會拒絕在背景中執行。 確保 GetAccessStatus 不會傳回被拒絕的 BackgroundAccessStatus 枚舉之一。 例如,如果使用者在裝置的設定中明確拒絕應用程式的背景工作許可權,這個方法會傳回 BackgroundAccessStatus.DeniedByUser

如果您的應用程式無法在背景執行,您的應用程式應該呼叫 RequestAccessAsync,並確保在註冊背景工作之前不會拒絕回應。

如需有關背景活動與省電模式的用戶選擇詳細資訊,請參閱最佳化背景活動

背景工作檢查清單

適用於程序內和程序外背景工作

  • 將您的背景工作與正確的觸發程序產生關聯。
  • 新增條件以協助確保背景工作順利執行。
  • 處理背景工作進度、完成和取消。
  • 在應用程式啟動期間重新註冊您的背景工作。 這可確保它們在應用程式首次啟動時註冊。 它還提供了一種方法來檢測用戶是否禁用了應用程式的背景執行功能 (如果註冊失敗)。
  • 檢查背景工作註冊錯誤。 如果適當,請嘗試以不同的參數值再次註冊背景工作。
  • 針對桌上型電腦以外的所有裝置系列,如果裝置記憶體不足,背景工作可能會終止。 如果未顯示記憶體不足例外狀況,或應用程式未處理例外狀況,則背景工作將會在沒有警告的情況下終止,並且不會觸發 OnCanceled 事件。 這有助於確保應用程式在前景的使用者體驗。 您的背景工作應該設計為處理此案例。

僅適用於程序外背景工作

  • 在 Windows 執行階段元件中建立背景工作。
  • 除了背景工作的快顯通知、磚和徽章更新之外,不顯示 UI。
  • Run 方法中,為每個非同步方法呼叫請求延遲,並在方法完成時關閉它們。 或者,使用帶有 async/await 的延遲。
  • 使用持久性儲存在背景工作和應用程式之間共用資料。
  • 在應用程式清單中聲明每個背景工作及其所使用的觸發程序類型。 確保入口點和觸發程序類型正確。
  • 不要在清單中指定 Executable 元素,除非您使用的觸發程序應在與應用程式相同的上下文中執行 (例如 ControlChannelTrigger)。

僅適用於處理中的背景工作

  • 取消工作時,請確定 BackgroundActivated 事件處理程式會在取消發生之前結束,否則將會終止整個程序。
  • 撰寫短期背景工作。 大多數的背景工作執行時間限制為 30 秒。

要避免的事項

  • 將透過 COM 或 RPC 的跨程序通訊使用降至最低。
  • 您嘗試與之通訊的程序可能未處於執行狀態,這可能會導致掛起。
  • 可能會花費大量時間來促進跨程序通訊,並將計入分配給執行背景工作的時間。
  • 請勿依賴背景工作中的用戶互動。