Directrices para tareas en segundo plano

Asegúrate de que tu aplicación cumple los requisitos para ejecutar tareas en segundo plano.

Guía de tareas en segundo plano

Tenga en cuenta las instrucciones siguientes al desarrollar la tarea en segundo plano y antes de publicar la aplicación.

Si usas una tarea en segundo plano para reproducir elementos multimedia en segundo plano, consulta Reproducir contenido multimedia en segundo plano para obtener información sobre las mejoras en Windows 10, versión 1607, que facilitan mucho.

Tareas en segundo plano en proceso frente a tareas en segundo plano fuera de proceso: Windows 10, versión 1607, introdujo tareas en segundo plano en proceso que le permiten ejecutar código en segundo plano en el mismo proceso que la aplicación en primer plano. Tenga en cuenta los siguientes factores al decidir si deben tener tareas en segundo plano en proceso frente a tareas en segundo plano fuera de proceso:

Consideración Impacto
Resistencia Si el proceso en segundo plano se ejecuta en otro proceso, un bloqueo en el proceso en segundo plano no quitará la aplicación en primer plano. Además, se puede finalizar la actividad en segundo plano, incluso dentro de la aplicación, si se ejecuta más allá de los límites de tiempo de ejecución. Separar el trabajo en segundo plano en una tarea independiente de la aplicación en primer plano puede ser una mejor opción cuando no es necesario que los procesos en primer plano y en segundo plano se comuniquen entre sí (ya que una de las principales ventajas de las tareas en segundo plano en proceso es que quitan la necesidad de comunicación entre procesos).
Simplicidad Las tareas en segundo plano en proceso no requieren comunicación entre procesos y son menos complejas de escribir.
Desencadenadores disponibles Las tareas en segundo plano en proceso no admiten los siguientes desencadenadores: DeviceUseTrigger, DeviceServicingTrigger e IoTStartupTask.
VoIP Las tareas en segundo plano en proceso no admiten la activación de una tarea en segundo plano de VoIP dentro de la aplicación.

Límites en el número de instancias de desencadenador: hay límites para el número de instancias de algunos desencadenadores que puede registrar una aplicación. Una aplicación solo puede registrar ApplicationTrigger, MediaProcessingTrigger y DeviceUseTrigger una vez por instancia de la aplicación. Si una aplicación supera este límite, el registro producirá una excepción.

Cuotas 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. La mayoría de los desencadenadores están limitados a 30 segundos de uso de reloj de pared, mientras que algunos tienen la capacidad de ejecutar hasta 10 minutos para completar tareas intensivas. Las tareas en segundo plano deben ser ligeras para ahorrar batería y proporcionar una mejor experiencia de usuario para las aplicaciones en primer plano. Consulte Compatibilidad con la aplicación con tareas en segundo plano para las restricciones de recursos aplicadas a las tareas en segundo plano.

Administrar tareas en segundo plano: la aplicación debe obtener una lista de tareas en segundo plano registradas, registrarse para controladores de progreso y finalización y controlar esos eventos de forma adecuada. Las clases de tareas en segundo plano deben notificar el progreso, la cancelación y la finalización. Para obtener más información, consulta Controlar una tarea en segundo plano cancelada y Supervisar el progreso y la finalización de la tarea en segundo plano.

Use BackgroundTaskDeferral: si la clase de tarea en segundo plano ejecuta código asincrónico, asegúrese de usar aplazamientos. De lo contrario, la tarea en segundo plano puede finalizar prematuramente cuando el método Run devuelve (o el método OnBackgroundActivated en el caso de tareas en segundo plano en proceso). Para obtener más información, consulte Creación y registro de una tarea en segundo plano fuera del proceso.

Como alternativa, solicite un aplazamiento y use async/await para completar llamadas de método asincrónicas. Cierre el aplazamiento después de las llamadas al método await .

Actualizar el manifiesto de la aplicación: para las tareas en segundo plano que se ejecutan fuera de proceso, declare cada tarea en segundo plano en el manifiesto de aplicación, junto con el tipo de desencadenadores con los que se usa. De lo contrario, la aplicación no podrá registrar la tarea en segundo plano en tiempo de ejecución.

Si tiene varias tareas en segundo plano, considere si deben ejecutarse en el mismo proceso de host o dividirse en procesos host diferentes. Colóquelos en procesos host independientes si le preocupa que un error en una tarea en segundo plano podría reducir otras tareas en segundo plano. Use la entrada Grupo de recursos en el diseñador de manifiestos para agrupar tareas en segundo plano en distintos procesos host.

Para establecer el grupo de recursos, abra el diseñador Package.appxmanifest, elija Declaraciones y agregue una declaración de App Service :

Configuración del grupo de recursos

Consulte la referencia del esquema de la aplicación para obtener más información sobre la configuración del grupo de recursos.

Las tareas en segundo plano que se ejecutan en el mismo proceso que la aplicación en primer plano no necesitan declararse en el manifiesto de aplicación. Para obtener más información sobre cómo declarar tareas en segundo plano que se ejecutan fuera de proceso en el manifiesto, vea Declarar tareas en segundo plano en el manifiesto de aplicación.

Preparar las actualizaciones de la aplicación: si la aplicación se actualizará, cree y registre una tarea en segundo plano ServicingComplete (consulte SystemTriggerType) para anular el registro de las tareas en segundo plano de la versión anterior de la aplicación y registrar las tareas en segundo plano para la nueva versión. También es un momento adecuado para realizar actualizaciones de aplicaciones que pueden ser necesarias fuera del contexto de ejecución en primer plano.

Solicitud para ejecutar tareas en segundo plano:

Importante A partir de Windows 10, ya no es necesario que las aplicaciones estén en la pantalla de bloqueo como requisito previo para ejecutar tareas en segundo plano.

Plataforma universal de Windows aplicaciones (UWP) pueden ejecutar todos los tipos de tareas compatibles sin anclarse a la pantalla de bloqueo. Sin embargo, las aplicaciones deben llamar a GetAccessState y comprobar que la aplicación no se deniega de ejecutarse en segundo plano. Asegúrese de que GetAccessStatus no devuelve una de las enumeraciones BackgroundAccessStatus denegadas. Por ejemplo, este método devolverá BackgroundAccessStatus.DeniedByUser si el usuario ha denegado explícitamente permisos de tareas en segundo plano para la aplicación en la configuración del dispositivo.

Si se deniega la ejecución de la aplicación en segundo plano, la aplicación debe llamar a RequestAccessAsync y asegurarse de que la respuesta no se deniega antes de registrar tareas en segundo plano.

Para obtener más información sobre la elección del usuario en torno a la actividad en segundo plano y el ahorro de batería, consulte Optimizar la actividad en segundo plano.

Lista de comprobación de tareas en segundo plano

Se aplica tanto a las tareas en segundo plano dentro del proceso como a las fuera de proceso.

  • Asocie la tarea en segundo plano con el desencadenador correcto.
  • Agregue condiciones para ayudar a garantizar que la tarea en segundo plano se ejecute correctamente.
  • Controlar el progreso, la finalización y la cancelación de tareas en segundo plano.
  • Vuelva a registrar las tareas en segundo plano durante el inicio de la aplicación. Esto garantiza que se registren la primera vez que se inicie la aplicación. También proporciona una manera de detectar si el usuario ha deshabilitado las funcionalidades de ejecución en segundo plano de la aplicación (en el registro de eventos se produce un error).
  • Compruebe si hay errores de registro de tareas en segundo plano. Si procede, intente volver a registrar la tarea en segundo plano con valores de parámetro diferentes.
  • Para todas las familias de dispositivos excepto el escritorio, si el dispositivo deja de estar en memoria, es posible que finalicen las tareas en segundo plano. Si no se muestra una excepción de memoria insuficiente o la aplicación no la controla, la tarea en segundo plano se finalizará sin advertencia y sin generar el evento OnCanceled. Esto ayuda a garantizar la experiencia del usuario de la aplicación en primer plano. La tarea en segundo plano debe diseñarse para controlar este escenario.

Solo se aplica a tareas en segundo plano fuera de proceso

  • Cree la tarea en segundo plano en un componente de Windows Runtime.
  • No muestre la interfaz de usuario que no sea las notificaciones del sistema, los iconos y las actualizaciones de distintivos de la tarea en segundo plano.
  • En el método Run , solicite aplazamientos para cada llamada de método asincrónico y ciérrelos cuando haya terminado el método. O bien, use un aplazamiento con async/await.
  • Use el almacenamiento persistente para compartir datos entre la tarea en segundo plano y la aplicación.
  • Declare cada tarea en segundo plano en el manifiesto de aplicación, junto con el tipo de desencadenadores con el que se usa. Asegúrese de que el punto de entrada y los tipos de desencadenador son correctos.
  • No especifique un elemento Ejecutable en el manifiesto a menos que use un desencadenador que se debe ejecutar en el mismo contexto que la aplicación (como ControlChannelTrigger).

Solo se aplica a las tareas en segundo plano en proceso

  • Al cancelar una tarea, asegúrese de que el BackgroundActivated controlador de eventos se cierra antes de que se produzca la cancelación o se finalizará todo el proceso.
  • Escriba tareas en segundo plano que sean de corta duración. La mayoría de las tareas en segundo plano están limitadas a 30 segundos de uso de reloj de pared.

Cosas que se deben evitar

  • Minimice el uso de la comunicación entre procesos a través de COM o RPC.
  • Es posible que el proceso con el que intenta comunicarse no esté en estado en ejecución, lo que puede provocar un bloqueo.
  • Una cantidad significativa de tiempo podría dedicarse a facilitar la comunicación entre procesos y contará con el tiempo asignado para ejecutar la tarea en segundo plano.
  • No confíe en la interacción del usuario en tareas en segundo plano.