Регистрация фоновых задач группы

Важные API

Класс BackgroundTaskRegistrationGroup

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

Когда приложение и платформа (или библиотека) использует регистрацию фоновой задачи с тем же именем, приложение может случайно удалить регистрацию фоновых задач платформы. Авторы приложений также могут случайно удалить регистрацию фоновых задач платформы и библиотеки, так как они могут отменить регистрацию всех зарегистрированных фоновых задач с помощью BackgroundTaskRegistration.AllTasks. С помощью групп можно изолировать регистрации фоновых задач, чтобы это не произошло.

Функции групп

  • Группы можно однозначно определить с помощью GUID. Они также могут иметь связанную строку понятного имени, которая проще читать во время отладки.
  • В группе можно зарегистрировать несколько фоновых задач.
  • Фоновые задачи, зарегистрированные в группе, не будут отображаться в BackgroundTaskRegistration.AllTasks. Таким образом, приложения, которые в настоящее время используют BackgroundTaskRegistration.AllTasks для отмены регистрации своих задач, непреднамеренно отменяют регистрацию фоновых задач, зарегистрированных в группе. См . статью Отмена регистрации фоновых задач в группе ниже, чтобы узнать, как отменить регистрацию всех фоновых триггеров, зарегистрированных в группе.
  • Каждая регистрация фоновых задач будет иметь свойство Group, чтобы определить, с какой группой она связана.
  • Регистрация фоновых задач в процессе в группе приведет к тому, что активация будет проходить через событие BackgroundTaskRegistrationGroup.BackgroundActivated вместо Application.OnBackgroundActivated.

Регистрация фоновой задачи в группе

Ниже показано, как зарегистрировать фоновую задачу (активируемую изменением часового пояса в этом примере) в составе группы.

private const string groupFriendlyName = "myGroup";
private const string groupId = "3F2504E0-4F89-41D3-9A0C-0305E82C3301";
private const string myTaskName = "My Background Trigger";

public static void RegisterBackgroundTaskInGroup()
{
   BackgroundTaskRegistrationGroup group = BackgroundTaskRegistration.GetTaskGroup(groupId);
   bool isTaskRegistered = false;

   // See if this task already belongs to a group
   if (group != null)
   {
       foreach (var taskKeyValue in group.AllTasks)
       {
           if (taskKeyValue.Value.Name == myTaskName)
           {
               isTaskRegistered = true;
               break;
           }
       }
   }

   // If the background task is not in a group, register it
   if (!isTaskRegistered)
   {
       if (group == null)
       {
           group = new BackgroundTaskRegistrationGroup(groupId, groupFriendlyName);
       }

       var builder = new BackgroundTaskBuilder();
       builder.Name = myTaskName;
       builder.TaskGroup = group; // we specify the group, here
       builder.SetTrigger(new SystemTrigger(SystemTriggerType.TimeZoneChange, false));

       // Because builder.TaskEntryPoint is not specified, OnBackgroundActivated() will be raised when the background task is triggered
       BackgroundTaskRegistration task = builder.Register();
   }
}

Отмена регистрации фоновых задач в группе

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

private static void UnRegisterAllTasks()
{
    // Unregister tasks that are part of a group
    foreach (var groupKeyValue in BackgroundTaskRegistration.AllTaskGroups)
    {
        foreach (var groupedTask in groupKeyValue.Value.AllTasks)
        {
            groupedTask.Value.Unregister(true); // passing true to cancel currently running instances of this background task
        }
    }

    // Unregister tasks that aren't part of a group
    foreach(var taskKeyValue in BackgroundTaskRegistration.AllTasks)
    {
        taskKeyValue.Value.Unregister(true); // passing true to cancel currently running instances of this background task
    }
}

Регистрация постоянных событий

При использовании групп регистрации фоновых задач с фоновыми задачами фоновые задачи фоновые активации направляются к событию группы, а не к объекту Application или CoreApplication. Это позволяет нескольким компонентам в приложении обрабатывать активацию, а не размещать все пути кода активации в объекте Application. Ниже показано, как зарегистрироваться для фонового активированного события группы. Сначала проверка BackgroundTaskRegistration.GetTaskGroup, чтобы определить, уже зарегистрирована ли группа. Если это не так, создайте новую группу с идентификатором и понятным именем. Затем зарегистрируйте обработчик событий в событии BackgroundActivated в группе.

void RegisterPersistentEvent()
{
    var group = BackgroundTaskRegistration.GetTaskGroup(groupId);
    if (group == null)
    {
        group = new BackgroundTaskRegistrationGroup(groupId, groupFriendlyName);
    }

    group.BackgroundActivated += MyEventHandler;
}