Raggruppare la registrazione delle attività in background
API importanti
BackgroundTaskRegistrationGroup class
Le attività in background possono ora essere registrate in un gruppo, che è possibile considerare come uno spazio dei nomi logico. Questo isolamento aiuta a garantire che i diversi componenti di un'app o le varie librerie non interferiscano reciprocamente con le relative registrazioni delle attività in background.
Quando un'app e il framework (o la libreria) in uso registra un'attività in background con lo stesso nome, l'app potrebbe inavvertitamente rimuovere le registrazioni delle attività in background del framework. Gli autori di app potrebbero anche rimuovere per errore le registrazioni delle attività in background del framework e della libreria perché potrebbero annullare la registrazione di tutte le attività in background registrate usando BackgroundTaskRegistration.AllTasks. Con i gruppi, è possibile isolare le registrazioni delle attività in background in modo che ciò non accada.
Gruppi di funzionalità
- I gruppi possono essere identificati in modo univoco da un GUID. Possono anche avere una stringa di nome descrittivo associata che è più facile da leggere durante il debug.
- È possibile registrare più attività in background in un gruppo.
- Le attività in background registrate in un gruppo non verranno visualizzate in BackgroundTaskRegistration.AllTasks. Le app che attualmente usano BackgroundTaskRegistration.AllTasks per annullare la registrazione delle attività non annullano inavvertitamente la registrazione delle attività in background registrate in un gruppo. Vedere Annullare la registrazione delle attività in background in un gruppo di seguito per vedere come annullare la registrazione di tutti i trigger in background registrati come parte di un gruppo.
- Ogni registrazione di attività in background avrà una proprietà Group per determinare il gruppo a cui è associata.
- La registrazione delle attività in background in-process con un gruppo causerà l'attivazione tramite l'evento BackgroundTaskRegistrationGroup.BackgroundActivated anziché Application.OnBackgroundActivated.
Registrare un'attività in background in un gruppo
Di seguito viene illustrato come registrare un'attività in background (attivata da una modifica del fuso orario, in questo esempio) come parte di un gruppo.
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();
}
}
Annullare la registrazione delle attività in background in un gruppo
Di seguito viene illustrato come annullare la registrazione delle attività in background registrate come parte di un gruppo. Poiché le attività in background registrate in un gruppo non vengono visualizzate in BackgroundTaskRegistration.AllTasks, è necessario scorrere i gruppi, trovare le attività in background registrate in ogni gruppo e annullarne la registrazione.
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
}
}
Registrare eventi persistenti
Quando si usano gruppi di registrazione attività in background con attività in background in-process, le attivazioni in background vengono indirizzate all'evento del gruppo anziché a quello nell'oggetto Application o CoreApplication. Ciò consente a più componenti all'interno dell'app di gestire l'attivazione anziché inserire tutti i percorsi del codice di attivazione nell'oggetto Application. Di seguito viene illustrato come eseguire la registrazione per l'evento attivato in background del gruppo. Controllare innanzitutto BackgroundTaskRegistration.GetTaskGroup per determinare se il gruppo è già stato registrato. In caso contrario, creare un nuovo gruppo con l'ID e il nome descrittivo. Registrare quindi un gestore eventi nell'evento BackgroundActivated nel gruppo.
void RegisterPersistentEvent()
{
var group = BackgroundTaskRegistration.GetTaskGroup(groupId);
if (group == null)
{
group = new BackgroundTaskRegistrationGroup(groupId, groupFriendlyName);
}
group.BackgroundActivated += MyEventHandler;
}