共用方式為


背景任務移轉策略

當計算機上叫用特定觸發程式時,UWP app 會大量使用背景工作來執行作業。 由於這些不需要任何服務在運行以監聽觸發器,因此非常節能。 因此,將 UWP 應用程式移轉至 WinUI 3 和其他使用 Windows App SDK 的桌面應用程式時,開發人員可能需要支援在平臺上實作背景工作。

UWP 應用程式模型中提供的背景工作可以是跨程式或內部工作。 本文說明在 Windows App SDK 中移至 BackgroundTaskBuilder API 時,這些類型的移轉策略。

程序外背景任務

在 UWP 中,針對跨程序的背景工作,背景工作將撰寫為 Windows 執行階段 (WinRT) 元件,並且在註冊期間,該元件會設定為 BackgroundTaskBuilder 上的 TaskEntryPoint。 在移轉至 Windows App SDK 時,開發人員可以保留此 as-is,並將 WinRT 元件與桌面專案封裝在一起。 在此情況下,代理程式基礎結構會在叫用觸發程式時啟動 backgroundtaskhost 進程,而且會在進程中執行 WinRT 元件背景工作。 在此方法中,背景工作會在低完整性層級 (IL) 進程中執行(backgroundtaskhost.exe),而主要桌面專案將在中 IL 進程中執行。

如果應用程式需要在中等 IL 進程本身中執行背景任務,則必須將完全信任 COM 元件用於背景任務。 在該案例中,開發人員需要使用 Windows App SDK BackgroundTaskBuilder 來註冊完全信任的 COM 元件。 請注意,BackgroundTaskBuilder 會從 windows.ApplicationModel.Background 命名空間 API API,在註冊某些觸發程式時擲回例外狀況。

您可以在 GitHub 找到完整的 WinUI 3 背景工作註冊範例。

如需實作的詳細資訊,請參閱 這裡。 唯一必要的變更是將 WinRT BackgroundTaskBuilder API 取代為 Windows App SDK API Microsoft.Windows.ApplicationModel.Background.BackgroundTaskBuilder

內部背景工作

針對 UWP 中的內部進程背景工作,背景工作例程會在 OnBackgroundActivated 回呼中實作,並作為前景程序的一部分執行。 在 WinUI 3 應用程式中,這不可能實現,因為 OnBackgroundActivated 回呼並不可用。 上述所述,應用程式必須將背景任務實作移至完全信任的 COM 工作,並在套件指令清單中定義 COM 伺服器,以處理該任務的 COM 啟用。 當觸發條件發生時,COM 啟用將在為此觸發條件註冊的對應 COM Coclass 上發生。

您可以在 GitHub 找到完整的 WinUI 3 背景工作註冊範例。

如需實作的詳細資訊,請參閱 這裡。 唯一的變更是將 WinRT BackgroundTaskBuilder API 取代為 Microsoft.Windows.ApplicationModel.Background.BackgroundTaskBuilder中的 Windows App SDK API。

Windows App SDK BackgroundTaskBuilder API

建立此 Windows App SDK BackgroundTaskBuilder API,是為了支援在 WinUI 3 和其他使用 Windows App SDK 的桌面應用程式中實作完全信任的 COM 背景工作,因為 WinRT API 在註冊時會擲回例外,但有幾個觸發條件除外。

下列程式代碼示範如何使用 Windows App SDK BackgroundTaskBuilder API 註冊背景工作:

//Using Windows App SDK API for BackgroundTaskBuilder
winrt::Microsoft::Windows::ApplicationModel::Background::BackgroundTaskBuilder builder;
SystemTrigger trigger = SystemTrigger(SystemTriggerType::TimeZoneChange, false);
auto backgroundTrigger = trigger.as<IBackgroundTrigger>();
builder.SetTrigger(backgroundTrigger);
builder.AddCondition(SystemCondition(SystemConditionType::InternetAvailable));
builder.SetTaskEntryPointClsid(classGuid);
builder.Register();

以下是對等的 C# 程式代碼:

// Using Windows App SDK API for BackgroundTaskBuilder
var builder = new Microsoft.Windows.ApplicationModel.Background.BackgroundTaskBuilder();
var trigger = new SystemTrigger(SystemTriggerType.TimeZoneChange, false);
builder.SetTrigger(trigger);
builder.AddCondition(new SystemCondition(SystemConditionType.InternetAvailable));
builder.SetTaskEntryPointClsid(classGuid);
builder.Register();

若要使用此 API,請將下列標記新增至項目檔,以啟用 Windows App SDK 背景工作:

<WindowsAppSDKBackgroundTask>true</WindowsAppSDKBackgroundTask>

此外,在指令清單檔中,BackgroundTaskEntryPoint 會設定為 Microsoft.Windows.ApplicationModel.Background.UniversalBGTask.Task

<Extension Category="windows.backgroundTasks" EntryPoint="Microsoft.Windows.ApplicationModel.Background.UniversalBGTask.Task">
    <BackgroundTasks>
        <Task Type="general"/>
    </BackgroundTasks>
</Extension>

針對 C# 應用程式,也需要將 ActivatableClass 註冊新增至清單檔:

<Extension Category="windows.activatableClass.inProcessServer">
    <InProcessServer>
        <Path>Microsoft.Windows.ApplicationModel.Background.UniversalBGTask.dll</Path>
        <ActivatableClass ActivatableClassId="Microsoft.Windows.ApplicationModel.Background.UniversalBGTask.Task" ThreadingModel="both"/>
    </InProcessServer>
</Extension>

利用TaskScheduler進行背景工作移轉

工作排程器 可協助傳統型應用程式達到UWP app中 BackgroundTaskBuilder 所提供的相同功能。 更多關於使用TaskScheduler 實作的詳細資訊可在這裡找到。

在 Windows App SDK 應用程式中使用 ApplicationTrigger

UWP 應用程式中支援 ApplicationTrigger,是因為應用程式進程可能會被暫停,這涉及應用程式生命周期管理的場景。 WinUI 和其他 Windows App SDK 傳統型應用程式不會發生此案例,因此 WinUI 應用程式中不支援此觸發程式。 與 ApplicationTrigger 相關的所有邏輯都必須重寫,以便透過啟動另一個程序或在線程集區線程中執行。 如需詳細資訊,請參閱 CreateThreadCreateProcess