后台任务和自定义触发器

后台任务是Windows 10中的一种方法,用于在后台运行代码。 它们是标准应用程序平台的一部分,实质上是让应用能够注册系统事件 (触发) 并在该事件发生时在后台运行预定义的代码块。 系统触发器包括网络连接或系统时区更改等事件。

在某些情况下,提供的系统触发器不足以解决合作伙伴方案。 从Windows 10版本 1803 开始,为了给合作伙伴提供更大的灵活性,并允许在更多情况下使用后台任务,合作伙伴可以创建应用可以注册的自定义触发器。 自定义触发器在设备驱动程序中定义,可用于针对所需的任何硬件条件引发事件。 引发自定义触发器时,应用可以执行后台任务的方式与标准应用模型完全相同。

实现自定义触发器

实现自定义触发器有两个步骤。 具体而言,必须在设备驱动程序或系统服务中定义和引发触发器,并且必须创建具有后台任务的应用。

创建自定义触发器

自定义触发器通过 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 定义了应用在创建后台任务时将注册的触发器的标识符。 此标识符必须是唯一的。

创建后台任务

创建后台任务并将其注册到自定义触发器的过程与用于使用标准系统触发器的后台任务的过程非常相似。

  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();
          }
       }
    }
    

有关创建、配置和使用后台任务和触发器的其他指导,请参阅 快速入门:创建和注册后台任务