Ejecutar una tarea en segundo plano en un temporizadorRun a background task on a timer

Obtenga información sobre cómo usar TimeTrigger para programar una tarea en segundo plano de una sola vez o ejecutar una tarea en segundo plano periódica.Learn how to use the TimeTrigger to schedule a one-time background task, or run a periodic background task.

Consulte Scenario4 en el ejemplo de activación en segundo plano para ver un ejemplo de cómo implementar la tarea en segundo plano desencadenada que se describe en este tema.See Scenario4 in the Background activation sample to see an example of how to implement the time triggered background task described in this topic.

En este tema se supone que tiene una tarea en segundo plano que debe ejecutarse periódicamente o en un momento determinado.This topic assumes that you have a background task that needs to run periodically, or at a specific time. Si aún no tiene una tarea en segundo plano, hay una tarea en segundo plano de ejemplo en BackgroundActivity.CS.If you don't already have a background task, there is a sample background task at BackgroundActivity.cs. O bien, siga los pasos descritos en crear y registrar una tarea en segundo plano en proceso o crear y registrar una tarea en segundo plano fuera de proceso para crear una.Or, follow the steps in Create and register an in-process background task or Create and register an out-of-process background task to create one.

Crear un desencadenador de horaCreate a time trigger

Crea un nuevo TimeTrigger.Create a new TimeTrigger. El segundo parámetro, OneShot, especifica si la tarea en segundo plano se ejecutará solo una vez o seguirá ejecutándose periódicamente.The second parameter, OneShot, specifies whether the background task will run only once or keep running periodically. Si OneShot se establece en "true", el primer parámetro (FreshnessTime) especifica el número de minutos que se debe esperar antes de programar la tarea en segundo plano.If OneShot is set to true, the first parameter (FreshnessTime) specifies the number of minutes to wait before scheduling the background task. Si el elemento OneShot se establece en False, el elemento FreshnessTime especifica la frecuencia con la que se ejecutará la tarea en segundo plano.If OneShot is set to false, FreshnessTime specifies the frequency at which the background task will run.

El temporizador integrado de las aplicaciones para la Plataforma universal de Windows (UWP) destinadas a la familia de dispositivos de escritorio o móviles ejecuta tareas en segundo plano en intervalos de 15 minutos.The built-in timer for Universal Windows Platform (UWP) apps that target the desktop or mobile device family runs background tasks in 15-minute intervals. (El temporizador se ejecuta en intervalos de 15 minutos, de modo que el sistema solo necesita reactivarse una vez cada 15 minutos para reactivar las aplicaciones que han solicitado TimerTriggers, lo que ahorra energía).(The timer runs in 15-minute intervals so that the system only needs to wake once every 15 minutes to wake up the apps that have requested TimerTriggers--which saves power.)

  • Si FreshnessTime se establece en 15 minutos y OneShot tiene el valor True, la tarea se programará para ejecutarse una vez entre 15 y 30 minutos después de que se registre.If FreshnessTime is set to 15 minutes and OneShot is true, the task will be scheduled to run once starting between 15 and 30 minutes from the time it is registered. Si se establece a 25 minutos y el elemento OneShot tiene el valor True, la tarea se programará para ejecutarse una vez entre 25 y 40 minutos después de que se registre.If it is set to 25 minutes and OneShot is true, the task will be scheduled to run once starting between 25 and 40 minutes from the time it is registered.

  • Si FreshnessTime se establece en 15 minutos y OneShot tiene el valor False, la tarea se programará para ejecutarse cada 15 minutos comenzando entre el minuto 15 y el 30 desde el momento en que se registre.If FreshnessTime is set to 15 minutes and OneShot is false, the task will be scheduled to run every 15 minutes starting between 15 and 30 minutes from the time it is registered. Si se ha establecido en n minutos y el elemento OneShot tiene el valor False, la tarea se programará para ejecutarse cada n minutos comenzando entre el minuto n y n + 15 después de registrarse.If it is set to n minutes and OneShot is false, the task will be scheduled to run every n minutes starting between n and n + 15 minutes after it is registered.

Nota

Si FreshnessTime se establece en menos de 15 minutos, se produce una excepción al intentar registrar la tarea en segundo plano.If FreshnessTime is set to less than 15 minutes, an exception is thrown when attempting to register the background task.

Por ejemplo, este desencadenador hará que una tarea en segundo plano se ejecute una vez por hora.For example, this trigger will cause a background task to run once an hour.

TimeTrigger hourlyTrigger = new TimeTrigger(60, false);
Windows::ApplicationModel::Background::TimeTrigger hourlyTrigger{ 60, false };
TimeTrigger ^ hourlyTrigger = ref new TimeTrigger(60, false);

(Opcional) Agregar una condición(Optional) Add a condition

Puede crear una condición de tarea en segundo plano para controlar el momento en que se ejecuta la tarea.You can create a background task condition to control when the task runs. Una condición impide que la tarea en segundo plano se ejecute hasta que se cumpla la condición.A condition prevents the background task from running until the condition is met. Para obtener más información, vea establecer las condiciones para ejecutar una tarea en segundo plano.For more information, see Set conditions for running a background task.

En este ejemplo, la condición se establece en UserPresent de forma que, al desencadenarse, la tarea solo se ejecuta cuando el usuario está activo.In this example the condition is set to UserPresent so that, once triggered, the task only runs once the user is active. Para obtener una lista de posibles condiciones, consulta SystemConditionType.For a list of possible conditions, see SystemConditionType.

SystemCondition userCondition = new SystemCondition(SystemConditionType.UserPresent);
Windows::ApplicationModel::Background::SystemCondition userCondition{
    Windows::ApplicationModel::Background::SystemConditionType::UserPresent };
SystemCondition ^ userCondition = ref new SystemCondition(SystemConditionType::UserPresent);

Para obtener información más detallada sobre las condiciones y los tipos de desencadenadores en segundo plano, consulte compatibilidad con la aplicación con tareas en segundo plano.For more in-depth information on conditions and types of background triggers, see Support your app with background tasks.

Llamar a RequestAccessAsync()Call RequestAccessAsync()

Antes de registrar la tarea en segundo plano ApplicationTrigger , llame a RequestAccessAsync para determinar el nivel de actividad en segundo plano que el usuario permite porque el usuario puede haber deshabilitado la actividad en segundo plano de la aplicación.Before registering the ApplicationTrigger background task, call RequestAccessAsync to determine the level of background activity the user allows because the user may have disabled background activity for your app. Consulte optimizar la actividad en segundo plano para obtener más información acerca de las formas en que los usuarios pueden controlar la configuración de la actividad en segundo plano.See Optimize background activity for more information about the ways users can control the settings for background activity.

var requestStatus = await Windows.ApplicationModel.Background.BackgroundExecutionManager.RequestAccessAsync();
if (requestStatus != BackgroundAccessStatus.AlwaysAllowed)
{
    // Depending on the value of requestStatus, provide an appropriate response
    // such as notifying the user which functionality won't work as expected
}

Registrar la tarea en segundo planoRegister the background task

Registra la tarea en segundo plano llamando a tu función de registro de tareas en segundo plano.Register the background task by calling your background task registration function. Para obtener más información sobre el registro de tareas en segundo plano y ver la definición del método RegisterBackgroundTask () en el código de ejemplo siguiente, vea registrar una tarea en segundo plano.For more information on registering background tasks, and to see the definition of the RegisterBackgroundTask() method in the sample code below, see Register a background task.

Importante

En el caso de las tareas en segundo plano que se ejecutan en el mismo proceso que la aplicación, no establezca entryPoint .For background tasks that run in the same process as your app, do not set entryPoint. Para las tareas en segundo plano que se ejecutan en un proceso independiente de la aplicación, establezca entryPoint como el espacio de nombres "." y el nombre de la clase que contiene la implementación de la tarea en segundo plano.For background tasks that run in a separate process from your app, set entryPoint to be the namespace, '.', and the name of the class that contains your background task implementation.

string entryPoint = "Tasks.ExampleBackgroundTaskClass";
string taskName   = "Example hourly background task";

BackgroundTaskRegistration task = RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition);
std::wstring entryPoint{ L"Tasks.ExampleBackgroundTaskClass" };
std::wstring taskName{ L"Example hourly background task" };

Windows::ApplicationModel::Background::BackgroundTaskRegistration task{
    RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition) };
String ^ entryPoint = "Tasks.ExampleBackgroundTaskClass";
String ^ taskName   = "Example hourly background task";

BackgroundTaskRegistration ^ task = RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition);

Los parámetros de registro de tareas en segundo plano se validan en el momento en que se realiza el registro.Background task registration parameters are validated at the time of registration. Se devuelve un error si cualquiera de los parámetros de registro no es válido.An error is returned if any of the registration parameters are invalid. Asegúrate de que la aplicación se ocupe correctamente de los escenarios en los que se produce un error en el registro de tareas en segundo plano. Si, en cambio, la aplicación depende de que haya un objeto de registro válido después de intentar registrar una tarea, es posible que se bloquee.Ensure that your app gracefully handles scenarios where background task registration fails - if instead your app depends on having a valid registration object after attempting to register a task, it may crash.

Administrar recursos para una tarea en segundo planoManage resources for your background task

Usa BackgroundExecutionManager.RequestAccessAsync para determinar si el usuario ha decidido que la actividad en segundo plano de la aplicación debe ser limitada.Use BackgroundExecutionManager.RequestAccessAsync to determine if the user has decided that your app’s background activity should be limited. Ten en cuenta el uso de la batería y ejecuta aplicaciones en segundo plano solo cuando sea necesario completar una acción que requiera el usuario.Be aware of your battery usage and only run in the background when it is necessary to complete an action that the user wants. Consulte optimizar la actividad en segundo plano para obtener más información acerca de las formas en que los usuarios pueden controlar la configuración de la actividad en segundo plano.See Optimize background activity for more information about the ways users can control the settings for background activity.

  • Memoria: el ajuste de la memoria y el uso energético de la aplicación es clave para asegurarse de que el sistema operativo permita la ejecución de la tarea en segundo plano.Memory: Tuning your app's memory and energy use is key to ensuring that the operating system will allow your background task to run. Use las API de administración de memoria para ver la cantidad de memoria que está usando la tarea en segundo plano.Use the Memory Management APIs to see how much memory your background task is using. Cuanto mayor sea la memoria que use la tarea en segundo plano, más difícil será que el sistema operativo siga ejecutándose cuando otra aplicación esté en primer plano.The more memory your background task uses, the harder it is for the OS to keep it running when another app is in the foreground. El usuario es, en última instancia, quien controla toda la actividad en segundo plano que la aplicación puede llevar a cabo y quien tiene visibilidad sobre el impacto que la aplicación tiene sobre el uso de la batería.The user is ultimately in control of all background activity that your app can perform and has visibility on the impact your app has on battery use.
  • Tiempo de CPU: las tareas en segundo plano están limitadas por la cantidad de tiempo de uso de reloj que se basa en el tipo de desencadenador.CPU time: Background tasks are limited by the amount of wall-clock usage time they get based on trigger type.

Consulta Dar soporte a tu aplicación mediante tareas en segundo plano para conocer las restricciones de recursos que se aplican a las tareas en segundo plano.See Support your app with background tasks for the resource constraints applied to background tasks.

ObservacionesRemarks

A partir de Windows 10, ya no es necesario que el usuario agregue la aplicación a la pantalla de bloqueo para poder utilizar tareas en segundo plano.Starting with Windows 10, it is no longer necessary for the user to add your app to the lock screen in order to utilize background tasks.

Una tarea en segundo plano solo se ejecutará con un TimeTrigger si se ha llamado a RequestAccessAsync en primer lugar.A background task will only run using a TimeTrigger if you have called RequestAccessAsync first.