Grouper l’inscription des tâches en arrière-plan

API importantes

Classe BackgroundTaskRegistrationGroup

Les tâches d’arrière-plan peuvent désormais être enregistrées dans un groupe, que vous pouvez considérer comme un espace de noms logique. Cet isolement permet de s’assurer que les différents composants d’une application, ou les différentes bibliothèques, n’interfèrent pas avec l’enregistrement des tâches d’arrière-plan des autres.

Lorsqu’une application et le framework (ou la bibliothèque) qu’elle utilise enregistrent une tâche d’arrière-plan portant le même nom, l’application peut supprimer par inadvertance les enregistrements de tâches d’arrière-plan du framework. Les auteurs d’applications peuvent également supprimer accidentellement les enregistrements de tâches d’arrière-plan du framework et de la bibliothèque, car ils peuvent désenregistrer toutes les tâches d’arrière-plan enregistrées en utilisant BackgroundTaskRegistration.AllTasks. Avec les groupes, vous pouvez isoler vos enregistrements de tâches d’arrière-plan afin que cela ne se produise pas.

Fonctionnalités des groupes

  • Les groupes peuvent être identifiés de manière unique par un GUID. Ils peuvent également être associés à une chaîne de noms conviviale, plus facile à lire lors du débogage.
  • Plusieurs tâches d’arrière-plan peuvent être enregistrées dans un groupe.
  • Les tâches d’arrière-plan enregistrées dans un groupe n’apparaîtront pas dans BackgroundTaskRegistration.AllTasks. Ainsi, les applications qui utilisent actuellement BackgroundTaskRegistration.AllTasks pour désenregistrer leurs tâches ne désenregistreront pas par inadvertance les tâches d’arrière-plan enregistrées dans un groupe. Consultez la section Désenregistrer les tâches d’arrière-plan d’un groupe ci-dessous pour savoir comment désenregistrer tous les déclencheurs d’arrière-plan qui ont été enregistrés en tant que membres d’un groupe.
  • Chaque enregistrement de tâche d’arrière-plan aura une propriété Group pour déterminer le groupe auquel il est associé.
  • L’enregistrement de tâches d’arrière-plan en cours de traitement avec un groupe entraînera l’activation par l’événement BackgroundTaskRegistrationGroup.BackgroundActivated au lieu de Application.OnBackgroundActivated.

Enregistrer une tâche d’arrière-plan dans un groupe

L’exemple suivant montre comment enregistrer une tâche d’arrière-plan (déclenchée par un changement de fuseau horaire, dans cet exemple) comme faisant partie d’un groupe.

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

Annuler l’enregistrement d’une tâche d’arrière-plan dans un groupe

La procédure suivante montre comment désenregistrer des tâches d’arrière-plan qui ont été enregistrées comme faisant partie d’un groupe. Comme les tâches d’arrière-plan enregistrées dans un groupe n’apparaissent pas dans BackgroundTaskRegistration.AllTasks, vous devez parcourir les groupes, rechercher les tâches d’arrière-plan enregistrées dans chaque groupe et les désenregistrer.

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
    }
}

Enregistrement d’événements persistants

Lorsque vous utilisez des groupes d’enregistrement de tâches d’arrière-plan avec des tâches d’arrière-plan en cours de traitement, les activations d’arrière-plan sont dirigées vers l’événement du groupe plutôt que vers celui de l’objet Application ou CoreApplication. Cela permet à plusieurs composants de votre application de gérer l’activation plutôt que de placer tous les chemins de code d’activation dans l’objet Application. Ce qui suit montre comment s’inscrire à l’événement d’activation en arrière-plan du groupe. Vérifiez d’abord BackgroundTaskRegistration.GetTaskGroup pour déterminer si le groupe a déjà été enregistré. Si ce n’est pas le cas, créez un nouveau groupe avec votre identifiant et un nom convivial. Enregistrez ensuite un gestionnaire d’événement pour l’événement BackgroundActivated du groupe.

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

    group.BackgroundActivated += MyEventHandler;
}