Поделиться через


Фоновые задачи и настраиваемые триггеры

Фоновые задачи — это один из методов 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);

В приведенном выше примере кода GUID, передаваемый в качестве параметра в функцию RtlRaiseCustomSystemEventTrigger , определяет идентификатор триггера, который приложение будет регистрировать при создании фоновой задачи. Этот идентификатор должен быть уникальным.

Создание фоновой задачи

Создание фоновой задачи и ее регистрация для настраиваемого триггера очень похожа на процесс, используемый для фоновых задач, работающих со стандартными системными триггерами.

  1. Начните с создания приложения UWP.

  2. Определите фоновую задачу в файле манифеста приложения, как показано в следующем примере. Обратите внимание, что для атрибута Type элемента Task задано значение ."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();
          }
       }
    }
    

Дополнительные рекомендации по созданию, настройке и работе с фоновыми задачами и триггерами см. в разделе Краткое руководство. Создание и регистрация фоновой задачи.