uwp
Tareas de fondo de UWP
Buscar..
Observaciones
- Para registrar una tarea en segundo plano que se ejecuta en un proceso separado, debe ir a la pestaña "Declaraciones" en el Package.appxmanifest y agregar una nueva "Tarea en segundo plano" y establecer el punto de entrada.
- El registro de una tarea en segundo plano de un solo proceso se puede realizar mediante
BackgroundTaskBuilder
, pero la aplicación generará una excepción si registra una tarea dos veces, por lo que debe verificar si ya ha registrado una tarea. - La aplicación debe obtener autorización para registrar una nueva tarea; esto puede hacerse llamando a
BackgroundExecutionManager.RequestAccessAsync()
, pero asegúrese de que realmente tenga el permiso. La llamada devuelve el tipo de acceso (enumeraciónBackgroundAccessStatus
) que indicará si tiene acceso o no. - Las tareas registradas se guardan hasta que se desinstala el paquete, pero no se perderá el comprobar las tareas que necesita en cada lanzamiento, ¡ocurre un error!
- Cuando se actualiza la aplicación, se revoca el permiso para registrar una nueva tarea. Para mantener su aplicación ejecutándose después de una actualización, especialmente si ha agregado un nuevo registro de tareas, debe eliminar y solicitar el acceso a través de
BackgroundAccessManager
. Un método para saber si su aplicación está actualizada, es registrar otra tarea con unSystemTrigger
, tipo deSystemTriggerType.ServicingComplete
.
Registro de una tarea
/// <summary>
/// Registers a background task in the system waiting to trigger
/// </summary>
/// <param name="taskName">Name of the task. Has to be unique</param>
/// <param name="taskEntryPoint">Entry point (Namespace) of the class (has to implement IBackgroundTask and has to be in a Windows Runtime Component) to start</param>
/// <param name="trigger">What has to be triggered to start the task</param>
/// <param name="condition">Optional condition. Can be null</param>
/// <param name="recreateIfExists">Should the Task be recreated if it already exists?</param>
/// <returns></returns>
public BackgroundTaskRegistration RegisterTask(string taskName, string taskEntryPoint, IBackgroundTrigger trigger, IBackgroundCondition condition = null) {
Debug.WriteLine("Try registering task: " + taskName);
var builder = new BackgroundTaskBuilder {
Name = taskName,
TaskEntryPoint = taskEntryPoint
};
builder.SetTrigger(trigger);
if (condition != null) {
builder.AddCondition(condition);
}
try {
var task = builder.Register();
Debug.WriteLine("Task successfully registered");
return task;
} catch (Exception exception) {
Debug.WriteLine("Error creating Task: " + exception);
return null;
}
}
Obtener una tarea registrada por su nombre
/// <summary>
/// Gets a BackgroundTask by its name
/// </summary>
/// <param name="taskName">Name of the task to find</param>
/// <returns>The found Task or null if none found</returns>
public BackgroundTaskRegistration TaskByName(string taskName) =>
BackgroundTaskRegistration.AllTasks.FirstOrDefault(x => x.Value.Name.Equals(taskName)).Value as BackgroundTaskRegistration;
La tarea
public sealed class BackgroundTask : IBackgroundTask {
private BackgroundTaskDeferral _deferral;
/// <summary>
/// Registers the listener to check if the button is pressed
/// </summary>
/// <param name="taskInstance">An interface to an instance of the background task. The system creates this instance when the task has been triggered to run.</param>
public async void Run(IBackgroundTaskInstance taskInstance) {
_deferral = taskInstance.GetDeferral();
//Do async operations here
_deferral.Complete();
}
}
Compruebe si la tarea está registrada
private bool IsTaskRegistered(string taskName) =>
BackgroundTaskRegistration.AllTasks.Any(x => x.Value.Name.Equals(taskName));
Activando una tarea manualmente
var trigger = new ApplicationTrigger();
TaskHandlerMentionedInThisTutorial.RegisterTask(TaskName, entryPoint, trigger, null, true);
await trigger.RequestAsync();
Anular el registro de una tarea
/// <summary>
/// Unregister a single background task with given name
/// </summary>
/// <param name="taskName">task name</param>
/// <param name="cancelTask">true if task should be cancelled, false if allowed to finish</param>
public void UnregisterTask(string taskName, bool cancelTask) =>
BackgroundTaskRegistration.AllTasks.First(x => x.Value.Name.Equals(taskName)).Value?.Unregister(cancelTask);
/// <summary>
/// Unregister an active group of background tasks, which name contains given string
/// </summary>
/// <param name="taskNamePart">part of the task name</param>
/// <param name="cancelTask">true if tasks should be cancelled, false if allowed to finish</param>
public void UnregisterTasks(string taskNamePart, bool cancelTask)
{
foreach (var task in BackgroundTaskRegistration.AllTasks.Where(x => x.Value.Name.Contains(taskNamePart)))
task.Value.Unregister(cancelTask);
}
Registrar tarea de fondo con disparador
La tarea en segundo plano es una excelente manera de realizar algún trabajo mientras la aplicación no se está ejecutando. Antes de poder utilizarlos, deberás registrarlos.
Aquí hay un ejemplo de una clase de tarea en segundo plano que incluye el registro con un desencadenante y una condición y la implementación Ejecutar
public sealed class Agent : IBackgroundTask
{
public void Run(IBackgroundTaskInstance taskInstance)
{
// run the background task code
}
// call it when your application will start.
// it will register the task if not already done
private static IBackgroundTaskRegistration Register()
{
// get the entry point of the task. I'm reusing this as the task name in order to get an unique name
var taskEntryPoint = typeof(Agent).FullName;
var taskName = taskEntryPoint;
// if the task is already registered, there is no need to register it again
var registration = BackgroundTaskRegistration.AllTasks.Select(x => x.Value).FirstOrDefault(x => x.Name == taskName);
if(registration != null) return registration;
// register the task to run every 30 minutes if an internet connection is available
var taskBuilder = new BackgroundTaskBuilder();
taskBuilder.Name = taskName;
taskBuilder.TaskEntryPoint = taskEntryPoint;
taskBuilder.SetTrigger(new TimeTrigger(30, false));
taskBuilder.AddCondition(new SystemCondition(SystemConditionType.InternetAvailable));
return taskBuilder.Register();
}
}
Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow