次の方法で共有


バックグラウンド タスクの移行戦略

バックグラウンド タスクは、コンピューター上で特定のトリガーが呼び出されたときにジョブを実行するために、UWP アプリで頻繁に使用されます。 トリガーを待ち受ける実行中のサービスが不要であるため、これらは非常に電力効率が高くなります。 そのため、Windows App SDK を使用する WinUI 3 やその他のデスクトップ アプリに UWP アプリを移行する際に、開発者はプラットフォームにバックグラウンド タスクを実装するためのサポートが必要になる場合があります。

UWP アプリ モデルで提供されるバックグラウンド タスクは、アウトプロセスまたはインプロセスのいずれかになります。 この記事では、Windows App SDK で BackgroundTaskBuilder API に移行するときの、これらの種類ごとの移行戦略について説明します。

アウトプロセス バックグラウンド タスク

UWP のアウトプロセス バックグラウンド タスクの場合、バックグラウンド タスクは Windows ランタイム (WinRT) コンポーネントとして書き込まれ、コンポーネントは登録時に BackgroundTaskBuilderTaskEntryPoint として設定されます。 Windows App SDK への移行中、開発者はこの as-is を維持し、デスクトップ プロジェクトと共に WinRT コンポーネントをパッケージ化できます。 この場合、ブローカー インフラストラクチャは、トリガーが呼び出されたときに backgroundtaskhost プロセスを起動し、WinRT コンポーネントのバックグラウンド タスクがプロセスで実行されます。 この方法では、バックグラウンド タスクは低整合性レベル (IL) プロセス (backgroundtaskhost.exe) で実行され、メイン デスクトップ プロジェクトは中 IL プロセスで実行されます。

アプリケーションが中程度の IL プロセス自体でバックグラウンド タスクを実行する必要がある場合は、完全信頼 COM コンポーネントをバックグラウンド タスクに使用する必要があります。 このシナリオでは、開発者は Windows App SDK BackgroundTaskBuilder を使用して、完全信頼 COM コンポーネントを登録する必要があります。 Windows.ApplicationModel.Background 名前空間の BackgroundTaskBuilder API では、一部のトリガーの登録中に例外がスローされることに注意してください。

完全な WinUI 3 バックグラウンド タスク登録サンプルは、GitHub にあります。

実装の詳細については、こちら参照してください。 必要な変更は、WinRT BackgroundTaskBuilder API を Windows App SDK API Microsoft.Windows.ApplicationModel.Background.BackgroundTaskBuilderに置き換えるだけです。

インプロセス バックグラウンド タスク

UWP のインプロセス バックグラウンド タスクの場合、バックグラウンド タスク ルーチンは、フォアグラウンド プロセスの一部として実行される OnBackgroundActivated コールバックに実装されます。 OnBackgroundActivated コールバックは使用できないため、WinUI 3 アプリケーションではこれを行うことはできません。 アプリケーションでは、前述のようにバックグラウンド タスクの実装を完全信頼 COM タスクに移動し、タスクの COM アクティブ化を処理するために、パッケージ マニフェストで COM サーバーを定義する必要があります。 トリガーが発生した場合、そのトリガーに登録された対応する COM Coclass の COM がアクティブ化されます。

完全な WinUI 3 バックグラウンド タスク登録サンプルは、GitHub にあります。

実装の詳細については、こちら参照してください。 唯一の変更は、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>

また、マニフェスト ファイルでは、BackgroundTaskEntryPointMicrosoft.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 アプリで BackgroundTaskBuilder によって提供されるのと同じ機能を実現するのに役立ちます。 TaskScheduler を使用した実装の詳細については、こちらをご参照ください。

Windows App SDK アプリケーションでの ApplicationTrigger の使用

ApplicationTrigger は、アプリケーション プロセスを中断できる有効期間管理シナリオにより、UWP アプリケーションでサポートされています。 このシナリオは、WinUI およびその他の Windows App SDK デスクトップ アプリケーションでは発生しないため、このトリガーは WinUI アプリケーションではサポートされていません。 ApplicationTrigger に関連するすべてのロジックは、別のプロセスを起動するか、スレッド プール スレッドで実行することによって実行されるように書き換える必要があります。 詳細については、CreateThread および CreateProcessを参照してください。