Фоновые задачи и настраиваемые триггеры
Фоновые задачи — это один из методов 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 , определяет идентификатор триггера, который приложение будет регистрировать при создании фоновой задачи. Этот идентификатор должен быть уникальным.
Создание фоновой задачи
Создание фоновой задачи и ее регистрация для настраиваемого триггера очень похожа на процесс, используемый для фоновых задач, работающих со стандартными системными триггерами.
Начните с создания приложения UWP.
Определите фоновую задачу в файле манифеста приложения, как показано в следующем примере. Обратите внимание, что для атрибута 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>
Зарегистрируйте приложение для прослушивания созданного пользовательского триггера, как показано в следующем фрагменте кода. Обратите внимание, что строка, используемая при создании экземпляра 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); }
Создайте фоновую задачу, как показано в следующем фрагменте кода.
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(); } } }
Дополнительные рекомендации по созданию, настройке и работе с фоновыми задачами и триггерами см. в разделе Краткое руководство. Создание и регистрация фоновой задачи.