次の方法で共有


バックグラウンド タスクとカスタム トリガー

バックグラウンド タスクは、バックグラウンドでコードを実行するための Windows 10 の 1 つの方法です。 これらは標準のアプリケーション プラットフォームの一部であり、基本的にシステム イベント (トリガー) に登録する機能をアプリに提供し、そのイベントが発生したときに、定義済みのコード ブロックをバックグラウンドで実行します。 システム トリガーには、ネットワーク接続の変更やシステム タイム ゾーンの変更などのイベントが含まれます。

状況によっては、提供されるシステム トリガーでは、パートナーのシナリオに対処するには不十分です。 Windows 10 バージョン 1803 以降では、パートナーに柔軟性を高め、より多くの状況でバックグラウンド タスクを使用できるようにするために、パートナーはアプリが登録できるカスタム トリガーを作成できます。 カスタム トリガーはデバイス ドライバー内で定義され、任意のハードウェア条件のイベントを発生させるために使用できます。 カスタム トリガーが発生すると、アプリは標準アプリ モデルとまったく同じ方法でバックグラウンド タスクを実行できます。

カスタム トリガーの実装

カスタム トリガーを実装するには、2 つの手順があります。 具体的には、デバイス ドライバーまたはシステム サービス内でトリガーを定義して発生させ、バックグラウンド タスクを含むアプリを作成する必要があります。

カスタム トリガーの作成

カスタム トリガーは、RtlRaiseCustomSystemEventTrigger 関数を使用して、ネイティブ サービスまたはデバイス ドライバー内で定義および発生します。 その後、ユニバーサル アプリから登録し、システム定義トリガーと比較的同じ方法でバックグラウンド タスクを開始するために使用できます。

次のコード抜粋は、カスタム トリガーを発生させる方法を示しています。

#define GUID_MY_CUSTOMSYSTEMEVENTTRIGGERID L"{9118718B-FF80-4AFE-BAF1-D88A4525F3AB}"

CUSTOM_SYSTEM_EVENT_TRIGGER_CONFIG triggerConfig;
CUSTOM_SYSTEM_EVENT_TRIGGER_INIT(&triggerConfig,
                                 GUID_MY_CUSTOMSYSTEMEVENTTRIGGERID);

NTSTATUS status = RtlRaiseCustomSystemEventTrigger(&triggerConfig);

上記のコード サンプル内で、RtlRaiseCustomSystemEventTrigger 関数にパラメーターとして渡される GUID は、バックグラウンド タスクの作成時にアプリが登録するトリガーの識別子を定義します。 この識別子は、GUID でなければなりません。

デバイス バックグラウンド タスクを作成する

バックグラウンド タスクの作成とカスタム トリガーへの登録は、標準のシステム トリガーで動作するバックグラウンド タスクに使用されるプロセスとよく似ています。

  1. まず、UWP アプリを作成します。

  2. 次の例に示すように、アプリ マニフェスト ファイルでバックグラウンド タスクを定義します。 Task 要素の Type 属性が次のよう"systemEvent"に設定されていることに注意してください。

    <Applications>
      <Application Id="MyBackgroundTaskSample.App" Executable="$targetnametoken$.exe" EntryPoint=" MyBackgroundTaskSample.App">
        <Extensions>
          <Extension Category="windows.backgroundTasks" EntryPoint="MyBackgroundTask.SampleBackgroundTask">
            <BackgroundTasks>
              <Task Type="systemEvent" />
            </BackgroundTasks>
          </Extension>
        </Extensions>
      </Application>
    </Applications>
    
  3. 次のコード抜粋に示すように、作成したカスタム トリガーをリッスンするようにアプリを登録します。 CustomSystemEventTrigger をインスタンス化するときに使用される文字列は、ネイティブ サービスまたはデバイス ドライバーでトリガーを作成するときに使用される GUID と一致する必要があることに注意してください。

    public void InitBackgroundTask()
    {
       // Create a new background task builder.
       BackgroundTaskBuilder taskBuilder = new BackgroundTaskBuilder();
    
       // Create a new CustomSystemEvent trigger.
       var myTrigger = new CustomSystemEventTrigger(
                            "{9118718B-FF80-4AFE-BAF1-D88A4525F3AB}", //Trigger Identifier
                            CustomSystemEventTriggerRecurrence.Once); //OneShot 
    
       // Associate the CustomSystemEvent trigger with the background task builder.
       taskBuilder.SetTrigger(myTrigger);
    
       // Specify the background task to run when the trigger fires.
       taskBuilder.TaskEntryPoint = MyBackgroundTask.SampleBackgroundTask;
    
       // Name the background task.
       taskBuilder.Name = "fabrikam.audio-jack.connected Task";
    
       // Register the background task.
       BackgroundTaskRegistration taskRegistration = taskBuilder.Register();
    
       // Associate completed event handler with the new background task.
       taskRegistration.Completed += new BackgroundTaskCompletedEventHandler(OnCompleted); 
    }
    
  4. 次のコードの抜粋に示すように、バックグラウンド タスクを作成します。

    namespace MyBackgroundTask
    {
       public sealed class SampleBackgroundTask : IBackgroundTask
       {
          // Called by the system when it's time to run our task
          public void Run(IBackgroundTaskInstance instance)
          {
             DoWork();
          }
       }
    }
    

バックグラウンド タスクとトリガーの作成、構成、操作に関するその他のガイダンスについては、「クイック スタート: バックグラウンド タスクの作成と登録」を参照してください