Compartilhar via


Registo de tarefas em segundo plano em grupo

APIs importantes

Classe BackgroundTaskRegistrationGroup

As tarefas em segundo plano agora podem ser registradas em um grupo, que são como se fosse um namespace lógico. Esse isolamento ajuda a garantir que diferentes componentes de um aplicativo, ou bibliotecas diferentes, não interfiram no registro da tarefa em segundo plano uns dos outros.

Quando um aplicativo e a estrutura (ou biblioteca) que ele usa registra uma tarefa em segundo plano com o mesmo nome, o aplicativo pode remover inadvertidamente os registros de tarefas em segundo plano da estrutura. Os autores de aplicativos também podem remover acidentalmente os registros de tarefas em segundo plano da estrutura e da biblioteca porque podem cancelar o registro de todas as tarefas em segundo plano registradas usando BackgroundTaskRegistration.AllTasks. Com grupos, você pode isolar seus registros de tarefas em segundo plano para que isso não aconteça.

Recursos de grupos

  • Os grupos podem ser identificados exclusivamente por um GUID. Eles também podem ter uma cadeia de caracteres de nome amigável associada, que é mais fácil de ler durante a depuração.
  • Várias tarefas em segundo plano podem ser registradas em um grupo.
  • As tarefas em segundo plano registradas em um grupo não aparecerão em BackgroundTaskRegistration.AllTasks. Assim, os aplicativos que atualmente usam BackgroundTaskRegistration.AllTasks para cancelar o registro de suas tarefas não cancelarão inadvertidamente o registro de tarefas em segundo plano registradas em um grupo. Consulte Cancelar o registro de tarefas em segundo plano em um grupo abaixo para ver como cancelar o registro de todos os gatilhos em segundo plano que foram registrados como parte de um grupo.
  • Cada registro de tarefa em segundo plano terá uma propriedade Group para determinar a qual grupo está associado.
  • Registrar tarefas em segundo plano no processo com um grupo fará com que a ativação passe pelo evento BackgroundTaskRegistrationGroup.BackgroundActivated em vez de Application.OnBackgroundActivated.

Registrar uma tarefa em segundo plano em um grupo

Veja a seguir como registrar uma tarefa em segundo plano (acionada por uma alteração de fuso horário, neste exemplo) como parte de um 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();
   }
}

Cancelar o registro de tarefas em segundo plano em um grupo

Veja a seguir como cancelar o registro de tarefas em segundo plano que foram registradas como parte de um grupo. Como as tarefas em segundo plano registradas em um grupo não aparecem em BackgroundTaskRegistration.AllTasks, você deve iterar pelos grupos, localizar as tarefas em segundo plano registradas em cada grupo e cancelar o registro delas.

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

Ao usar grupos de registro de tarefas em segundo plano com tarefas em segundo plano em processo, as ativações em segundo plano são direcionadas para o evento do grupo em vez daquele no objeto Application ou CoreApplication. Isso permite que vários componentes em seu aplicativo manipulem a ativação em vez de colocar todos os caminhos de código de ativação no objeto Application. Veja a seguir como se registrar para o evento ativado em segundo plano do grupo. Primeiro, verifique BackgroundTaskRegistration.GetTaskGroup para determinar se o grupo já foi registrado. Caso contrário, crie um novo grupo com sua ID e nome amigável. Em seguida, registre um manipulador de eventos no evento BackgroundActivated no grupo.

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

    group.BackgroundActivated += MyEventHandler;
}