Compartir a través de


Ejecutar una tarea en segundo plano en un temporizador

Aprenda a 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 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.

Creación de un desencadenador de hora

Cree un nuevo TimeTrigger. El segundo parámetro, OneShot, especifica si la tarea en segundo plano solo se ejecutará 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 deben esperar antes de programar la tarea en segundo plano. Si OneShot se establece en false, FreshnessTime especifica la frecuencia con la que se ejecutará la tarea en segundo plano.

El temporizador integrado para aplicaciones de Plataforma universal de Windows (UWP) destinadas a la familia de dispositivos móviles o de escritorio 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 es true, la tarea se programará para ejecutarse una vez que comience entre 15 y 30 minutos desde el momento en que se registre. Si se establece en 25 minutos y OneShot es true, la tarea se programará para ejecutarse una vez a partir de 25 y 40 minutos desde el momento en que se registra.

  • Si FreshnessTime se establece en 15 minutos y OneShot es false, la tarea se programará para ejecutarse cada 15 minutos a partir de 15 y 30 minutos desde el momento en que se registra. Si se establece en n minutos y OneShot es false, la tarea se programará para ejecutarse cada n minutos a partir de n y n + 15 minutos 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 para que, una vez desencadenada, la tarea solo se ejecute una vez que el usuario esté activo. Para obtener una lista de las posibles condiciones, consulte 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, 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 permite el usuario, ya que 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

Registre la tarea en segundo plano llamando a la 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 tareas 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 del registro. Se devuelve un error si alguno de los parámetros de registro no es válido. Asegúrese de que la aplicación controla correctamente los escenarios en los que se produce un error en el registro de tareas en segundo plano; en su lugar, la aplicación depende de tener un objeto de registro válido después de intentar registrar una tarea, puede bloquearse.

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 estar limitada. Tenga en cuenta el uso de la batería y ejecute solo en segundo plano cuando sea necesario completar una acción que el usuario desee. 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 usa 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. En última instancia, el usuario tiene el control de toda la actividad en segundo plano que la aplicación puede realizar y tiene visibilidad sobre el impacto que tiene la aplicación en 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.

Consulte Compatibilidad con la aplicación con tareas en segundo plano para las restricciones de recursos aplicadas 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.