Ejecutar una tarea en segundo plano en un temporizador

Obtenga información sobre cómo usar TimeTrigger para programar una tarea en segundo plano única o ejecutar una tarea en segundo plano periódica.

Consulte Escenario4 en el ejemplo de activación en segundo plano para ver un ejemplo de cómo implementar la tarea en segundo plano desencadenada por el tiempo que se describe en este tema.

En este tema se supone que tiene una tarea en segundo plano que debe ejecutarse periódicamente o en un momento específico. Si aún no tiene una tarea en segundo plano, hay una tarea en segundo plano de ejemplo en BackgroundActivity.cs. O bien, siga los pasos descritos en Creación y registro de una tarea en segundo plano dentro del proceso o Crear y registrar una tarea en segundo plano fuera de proceso para crear una.

Crear un desencadenador de hora

Crea un nuevo TimeTrigger. El segundo parámetro, OneShot, especifica si la tarea en segundo plano se ejecutará solo una vez o seguirá ejecutándose periódicamente. 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. Si el elemento OneShot se establece en False, el elemento FreshnessTime especifica la frecuencia con la que se ejecutará la tarea en segundo plano.

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. (El temporizador se ejecuta en intervalos de 15 minutos para que el sistema solo necesite reactivarse una vez cada 15 minutos para reactivar las aplicaciones que han solicitado TimerTriggers, lo que ahorra energía).

  • 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. 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.

  • 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. 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.

Nota:

Si FreshnessTime se establece en menos de 15 minutos, se produce una excepción al intentar registrar la tarea en segundo plano.

Por ejemplo, este desencadenador hará que una tarea en segundo plano se ejecute una vez por hora.

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

Puede crear una condición de tarea en segundo plano para controlar cuándo se ejecuta la tarea. Una condición impide que la tarea en segundo plano se ejecute hasta que se cumpla la condición. Para obtener más información, vea Establecer condiciones para ejecutar una tarea en segundo plano.

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. Para obtener una lista de posibles condiciones, consulta 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 más información detallada sobre las condiciones y los tipos de desencadenadores en segundo plano, consulta Compatibilidad de la aplicación con tareas en segundo plano.

Llamar a 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 es posible que el usuario haya deshabilitado la actividad en segundo plano de la aplicación. Consulte Optimización de la actividad en segundo plano para obtener más información sobre las formas en que los usuarios pueden controlar la configuración de la actividad en segundo plano.

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 plano

Registra la tarea en segundo plano llamando a tu función de registro de tareas en segundo plano. Para obtener más información sobre cómo registrar 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.

Importante

En el caso de las tareas en segundo plano que se ejecutan en el mismo proceso que la aplicación, no establezca entryPoint. En el caso de las tareas en segundo plano que se ejecutan en un proceso independiente de la aplicación, establezca entryPoint como espacio de nombres, "." y el nombre de la clase que contiene la implementación de la tarea en segundo plano.

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. Se devuelve un error si cualquiera de los parámetros de registro no es válido. 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.

Administración de recursos para la tarea en segundo plano

Usa BackgroundExecutionManager.RequestAccessAsync para determinar si el usuario ha decidido que la actividad en segundo plano de la aplicación debe ser limitada. 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. Consulte Optimización de la actividad en segundo plano para obtener más información sobre las formas en que los usuarios pueden controlar la configuración de la actividad en segundo plano.

  • Memoria: optimizar la memoria y el uso de energía de la aplicación es clave para asegurarse de que el sistema operativo permitirá que se ejecute la tarea en segundo plano. Use las API de administración de memoria para ver la cantidad de memoria que usa la tarea en segundo plano. Cuanto más memoria use la tarea en segundo plano, más difícil es que el sistema operativo lo mantenga en ejecución cuando otra aplicación está en primer plano. 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.
  • Tiempo de CPU: las tareas en segundo plano están limitadas por la cantidad de tiempo de uso del reloj que obtienen en función del tipo de desencadenador.

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.

Comentarios

A partir de Windows 10, ya no es necesario que el usuario agregue la aplicación a la pantalla de bloqueo para poder usar tareas en segundo plano.

Una tarea en segundo plano solo se ejecutará con timeTrigger si ha llamado primero a RequestAccessAsync .