Agrupar el registro de tareas en segundo plano

API importantes

clase BackgroundTaskRegistrationGroup

Las tareas en segundo plano ahora se pueden registrar en un grupo, que se puede considerar como un espacio de nombres lógico. Este aislamiento ayuda a garantizar que los diferentes componentes de una aplicación o de diferentes bibliotecas no interfieren entre sus propios registros de tareas en segundo plano.

Cuando una aplicación y el marco (o biblioteca) que utiliza registra una tarea en segundo plano con el mismo nombre, la aplicación podría quitar accidentalmente los registros de tareas en segundo plano del marco. Los autores de aplicaciones también podrían quitar accidentalmente los registros de tareas en segundo plano de la biblioteca y del marco porque podrían anular el registro de todas las tareas en segundo plano registradas mediante BackgroundTaskRegistration.AllTasks. Con los grupos, puede aislar los registros de tareas en segundo plano para que esto no suceda.

Características de los grupos

  • Los grupos se pueden identificar de forma única mediante un GUID. También pueden tener asociada una cadena de nombre descriptivo, que es más fácil de leer durante la depuración.
  • Se pueden registrar varias tareas en segundo plano en un grupo.
  • Las tareas en segundo plano registradas en un grupo no aparecerán en BackgroundTaskRegistration.AllTasks. De este modo, las aplicaciones que actualmente usan BackgroundTaskRegistration.AllTasks para anular el registro de sus tareas no anularán accidentalmente el registro de las tareas en segundo plano registradas en un grupo. Consulte Anular el registro de tareas en segundo plano en un grupo a continuación para ver cómo anular el registro de todos los desencadenadores en segundo plano que se han registrado como parte de un grupo.
  • Cada registro de tarea en segundo plano tendrá una propiedad Group para determinar a qué grupo está asociado.
  • El registro de tareas en segundo plano en proceso con un grupo hará que la activación pase por el evento BackgroundTaskRegistrationGroup.BackgroundActivated en lugar de Application.OnBackgroundActivated.

Registrar una tarea en segundo plano en un grupo

A continuación se muestra cómo registrar una tarea en segundo plano (desencadenada por un cambio de zona horaria, en este ejemplo) como parte de un grupo.

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

Anular el registro de tareas en segundo plano en un grupo

A continuación se muestra cómo anular el registro de las tareas en segundo plano registradas como parte de un grupo. Dado que las tareas en segundo plano registradas en un grupo no aparecen en BackgroundTaskRegistration.AllTasks, debe recorrer en iteración los grupos, buscar las tareas en segundo plano registradas en cada grupo y anular su registro.

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

Registrar eventos persistentes

Cuando se usan grupos de registro de tareas en segundo plano con tareas en segundo plano en proceso, las activaciones en segundo plano se dirigen al evento del grupo en lugar del correspondiente al objeto Application o CoreApplication. Esto permite que varios componentes de la aplicación controlen la activación en lugar de colocar todas las rutas de acceso de código de activación en el objeto Application. A continuación se muestra cómo registrar para el evento activado en segundo plano del grupo. En primer lugar, compruebe BackgroundTaskRegistration.GetTaskGroup para determinar si el grupo ya se ha registrado. Si no es así, cree un nuevo grupo con el identificador y el nombre descriptivo. A continuación, registre un controlador de eventos en el evento BackgroundActivated del grupo.

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

    group.BackgroundActivated += MyEventHandler;
}