Directrices para tareas en segundo planoGuidelines for background tasks

Asegúrate de que tu aplicación cumple los requisitos para ejecutar tareas en segundo plano.Ensure your app meets the requirements for running background tasks.

Guía de tareas en segundo planoBackground task guidance

Ten en cuenta las indicaciones siguientes a la hora de desarrollar la tarea en segundo plano y antes de publicar una aplicación.Consider the following guidance when developing your background task, and before publishing your app.

Si usas una tarea en segundo plano para reproducir contenido multimedia en segundo plano, consulta Reproducir elementos multimedia en segundo plano para obtener información sobre las mejoras en Windows 10, versión 1607, que lo hacen mucho más fácil.If you use a background task to play media in the background, see Play media in the background for information about improvements in Windows 10, version 1607, that make it much easier.

Tareas en segundo plano dentro de proceso frente a aquellas fuera de proceso: Windows 10, versión 1607, incluye tareas en segundo plano dentro de proceso que te permiten ejecutar código en segundo plano en el mismo proceso que la aplicación en primer plano.In-process versus out-of-process background tasks: Windows 10, version 1607, introduced in-process background tasks which allows you to run background code in the same process as your foreground app. Ten en cuenta estos factores a la hora de decidir si quieres tareas en segundo plano dentro o fuera de proceso:Consider the following factors when deciding whether to have in-process vs. out-of-process background tasks:

ConsideraciónConsideration ImpactoImpact
ResistenciaResilience Si el proceso en segundo plano se ejecuta en otro proceso y se produce un bloqueo en el proceso en segundo plano, este no provocará un error en la aplicación en primer plano.If your background process is running in another process, a crash in your background process won't take down your foreground application. Además, la actividad en segundo plano puede finalizar, incluso dentro de la aplicación, si se ejecuta más allá de los límites de tiempo de ejecución.Also, background activity can be terminated, even within your app, if it runs past execution time limits. Separar el trabajo en segundo plano en una tarea independiente de la aplicación en primer plano puede ser una mejor elección cuando no es necesario que los procesos de primer y segundo plano se comuniquen entre sí (porque una de las principales ventajas de las tareas en segundo plano dentro de proceso es que acaban con la necesidad de comunicación entre procesos).Separating background work into a task separate from the foreground app may be a better choice when it isn't necessary for the foreground and background processes to communicate with each other (since one of the main advantages of in-process background tasks are that they remove the need for inter-process communication).
SimplicidadSimplicity Las tareas en segundo plano dentro de proceso no requieren la comunicación entre procesos y son menos complejas de escribir.In-process background tasks don't require cross-process communication and are less complex to write.
Desencadenadores disponiblesAvailable triggers Las tareas en segundo plano dentro de proceso no admiten los siguientes desencadenadores: DeviceUseTrigger, DeviceServicingTrigger e IoTStartupTask.In-process background tasks don't support the following triggers: DeviceUseTrigger, DeviceServicingTrigger and IoTStartupTask.
VoIPVoIP Las tareas en segundo plano dentro de proceso no admiten la activación de una tarea en segundo plano VoIP dentro de la aplicación.In-process background tasks don't support activating a VoIP background task within your application.

Límites en el número de instancias de desencadenador: Hay límites en el número de instancias de algunos desencadenadores que puede registrar una aplicación.Limits on the number of trigger instances: There are limits to how many instances of some triggers an app can register. Una aplicación solo puede registrar ApplicationTrigger, MediaProcessingTrigger y DeviceUseTrigger una vez por cada instancia de la aplicación.An app can only register ApplicationTrigger, MediaProcessingTrigger and DeviceUseTrigger once per instance of the app. Si una aplicación supera este límite, el registro producirá una excepción.If an app goes over this limit, registration will throw an exception.

Cuotas 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 quotas: Background tasks are limited by the amount of wall-clock usage time they get based on trigger type. La mayoría de los desencadenadores están limitados a 30 segundos de uso de reloj, aunque algunos tienen la capacidad de ejecutarse hasta 10 minutos para completar tareas intensivas.Most triggers are limited to 30 seconds of wall-clock usage, while some have the ability to run up to 10 minutes in order to complete intensive tasks. 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.Background tasks should be lightweight to save battery life and provide a better user experience for foreground apps. 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.

Administrar tareas en segundo plano: La aplicación debe obtener una lista de tareas en segundo plano registradas, registrarse para los controladores de progreso y finalización, y controlar dichos eventos de forma adecuada.Manage background tasks: Your app should get a list of registered background tasks, register for progress and completion handlers, and handle those events appropriately. Tus clases de tareas en segundo plano deben informar del progreso, la cancelación y la finalización.Your background task classes should report progress, cancellation, and completion. Para obtener más información, consulte administrar una tarea en segundo plano canceladay supervisar el progreso y la finalización de las tareas en segundo plano.For more info see Handle a cancelled background task, and Monitor background task progress and completion.

Usar BackgroundTaskDeferral: Si la clase de tarea en segundo plano ejecuta código asincrónico, asegúrese de usar aplazamientos.Use BackgroundTaskDeferral: If your background task class runs asynchronous code, make sure to use deferrals. De lo contrario, es posible que la tarea en segundo plano finalice prematuramente cuando el método Run devuelva (o el método OnBackgroundActivated en el caso de tareas en segundo plano en proceso).Otherwise your background task may be terminated prematurely when the Run method returns (or the OnBackgroundActivated method in the case of in-process background tasks). Para obtener más información, consulta Crear y registrar una tarea en segundo plano fuera de proceso.For more information, see Create and register an out-of-process background task.

Como alternativa, solicita un solo aplazamiento y usa async/await para completar las llamadas a métodos asincrónicos.Alternatively, request one deferral, and use async/await to complete asynchronous method calls. Cierra el aplazamiento después de las llamadas al método await.Close the deferral after the await method calls.

Actualización del manifiesto de la aplicación: en el caso de las tareas que se ejecutan fuera de proceso, declara todas las tareas en segundo plano en el manifiesto de la aplicación, junto con el tipo de desencadenadores con que se usan.Update the app manifest: For background tasks that run out-of-process, declare each background task in the application manifest, along with the type of triggers it is used with. En caso contrario, tu aplicación no podrá registrar la tarea en segundo plano en tiempo de ejecución.Otherwise your app will not be able to register the background task at runtime.

Si tiene varias tareas en segundo plano, considere si deben ejecutarse en el mismo proceso de host o separarse en procesos de host diferentes.If you have multiple background tasks, consider whether they should run in the same host process or be separated into different host processes. Colóquelos en procesos de host independientes si le preocupa que un error en una tarea en segundo plano desactive otras tareas en segundo plano.Put them in separate host processes if you are concerned that a failure in one background task could bring down other background tasks. Use la entrada del grupo de recursos en el diseñador de manifiestos para agrupar las tareas en segundo plano en procesos de host diferentes.Use the Resource group entry in the manifest designer to group background tasks into different host processes.

Para establecer el grupo de recursos, abra el diseñador package. appxmanifest, elija declaraciones y agregue una declaración de App Service :To set the Resource group, open the Package.appxmanifest designer, choose Declarations, and add an App Service declaration:

Configuración del grupo de recursos

Vea la Referencia del esquema de la aplicación para obtener más información sobre la configuración del grupo de recursos.See the application schema reference for more information about the resource group setting.

Las tareas en segundo plano que se ejecutan en el mismo proceso que la aplicación en primer plano no necesitan declararse a sí mismas en el manifiesto de la aplicación.Background tasks that run in the same process as the foreground app do not need to declare themselves in the application manifest. Para obtener más información sobre cómo declarar tareas en segundo plano que se ejecutan fuera de proceso en el manifiesto, consulta Declarar tareas en segundo plano en el manifiesto de la aplicación.For more information about declaring background tasks that run out-of-process in the manifest, see Declare background tasks in the application manifest.

Preparación para actualizaciones de la aplicación: si la aplicación se va a actualizar, crea y registra una tarea en segundo plano ServicingComplete (consulta SystemTriggerType) para anular el registro de tareas en segundo plano para las versiones anteriores de la aplicación y registrar las tareas en segundo plano para la nueva versión.Prepare for app updates: If your app will be updated, create and register a ServicingComplete background task (see SystemTriggerType) to unregister background tasks for the previous version of the app, and register the background tasks for the new version. También es un momento adecuado para realizar actualizaciones de aplicaciones que puedan ser necesarias fuera del contexto de ejecución en primer plano.This is also an appropriate time to perform app updates that may be necessary outside the context of running in the foreground.

Solicitar la ejecución de tareas en segundo plano:Request to execute background tasks:

Importante: a partir de Windows 10, ya no es necesario que las aplicaciones estén en la pantalla de bloqueo como un requisito previo para ejecutar tareas en segundo plano.Important Starting in Windows 10, apps are no longer required to be on the lock screen as a prerequisite to run background tasks.

Todas las aplicaciones para la Plataforma universal de Windows (UWP) pueden ejecutar tipos de tareas admitidos sin necesidad de que se anclen en la pantalla de bloqueo.Universal Windows Platform (UWP) apps can run all supported task types without being pinned to the lock screen. Sin embargo, las aplicaciones deben llamar a GetAccessState y comprobar que no se deniegue la ejecución de la aplicación en segundo plano.However, apps must call GetAccessState and check that the app is not denied from running in the background. Asegúrese de que GetAccessStatus no devuelve una de las enumeraciones BackgroundAccessStatus denegadas.Ensure that GetAccessStatus does not return one of the denied BackgroundAccessStatus enums. Por ejemplo, este método devolverá BackgroundAccessStatus. DeniedByUser si el usuario ha denegado explícitamente permisos de tarea en segundo plano para la aplicación en la configuración del dispositivo.For example, this method will return BackgroundAccessStatus.DeniedByUser if the user has explicitly denied background task permissions for your app in the device's settings.

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 las tareas en segundo plano.If your app is denied from running in the background, your app should call RequestAccessAsync and ensure the response is not denied before registering background tasks.

Para obtener más información sobre la elección del usuario alrededor de la actividad en segundo plano y el ahorro de batería, consulte optimizar la actividad en segundo plano.For more information on user choice around background activity and Battery Saver, see Optimize Background Activity.

Lista de comprobación de tareas en segundo planoBackground task checklist

Se aplica tanto a las tareas en segundo plano tanto dentro como fuera de proceso.Applies to both in-process and out-of-process background tasks

  • Asocia tu tarea en segundo plano con el desencadenador correcto.Associate your background task with the correct trigger.
  • Agrega condiciones para asegurarte de que tu tarea en segundo plano se ejecuta correctamente.Add conditions to help ensure your background task runs successfully.
  • Controla el progreso, la finalización y la cancelación de las tareas en segundo plano.Handle background task progress, completion, and cancellation.
  • Vuelve a registrar las tareas en segundo plano durante el inicio de la aplicación.Re-register your background tasks during app launch. Esto garantiza su registro la primera vez que se inicie la aplicación.This ensures that they are registered the first time the app is launched. Además, proporciona una manera de detectar si el usuario deshabilitó las funcionalidades de ejecución en segundo plano de la aplicación (en caso de error en el registro del evento).It also provides a way to detect whether the user has disabled your app's background execution capabilities (in the event registration fails).
  • Comprueba si hay errores de registro de tareas en segundo plano.Check for background task registration errors. Si procede, intenta volver a registrar la tarea en segundo plano con otros valores de parámetros.If appropriate, attempt to register the background task again with different parameter values.
  • Para todas las familias de dispositivos excepto la de equipos de escritorio, si el dispositivo dispone de poca memoria, las tareas en segundo plano podrían finalizarse.For all device families except desktop, if the device becomes low on memory, background tasks may be terminated. Si no se expone una excepción de falta de memoria o la aplicación no la controla, la tarea en segundo plano finalizará sin que se muestre ninguna advertencia y sin que se genere el evento OnCanceled.If an out of memory exception is not surfaced, or the app does not handle it, then the background task will be terminated without warning and without raising the OnCanceled event. Esto contribuye a garantizar la experiencia del usuario de la aplicación en primer plano.This helps to ensure the user experience of the app in the foreground. La tarea en segundo plano debe estar diseñada para controlar este escenario.Your background task should be designed to handle this scenario.

Se aplica solo a las tareas en segundo plano fuera de proceso.Applies only to out-of-process background tasks

  • Cree su tarea en segundo plano en un componente de Windows Runtime.Create your background task in a Windows Runtime component.
  • No muestres opciones de la interfaz de usuario que no sean notificaciones del sistema, iconos o actualizaciones de distintivo procedentes de la tarea en segundo plano.Do not display UI other than toasts, tiles, and badge updates from the background task.
  • En el método Run, solicita aplazamientos para todas las llamadas a métodos asincrónicos y ciérralos cuando el método haya terminado.In the Run method, request deferrals for each asynchronous method call, and close them when the method is done. O bien, use un aplazamiento con Async/Await.Or, use one deferral with async/await.
  • Usa almacenamiento persistente para compartir datos entre la tarea en segundo plano y la aplicación.Use persistent storage to share data between the background task and the app.
  • Declara todas las tareas en segundo plano en el manifiesto de la aplicación, junto con el tipo de desencadenador con el que se usan.Declare each background task in the application manifest, along with the type of triggers it is used with. Asegúrate de que el punto de entrada y los tipos de desencadenadores son correctos.Make sure the entry point and trigger types are correct.
  • No especifique un elemento ejecutable en el manifiesto a menos que esté usando un desencadenador que se debe ejecutar en el mismo contexto que la aplicación (por ejemplo, la ControlChannelTrigger).Do not specify an Executable element in the manifest unless you are using a trigger that should be run in the same context as the app (such as the ControlChannelTrigger).

Se aplica solo a las tareas en segundo plano dentro de proceso.Applies only to in-process background tasks

  • Al cancelar una tarea, asegúrate de que el controlador de eventos BackgroundActivated existe antes de que se produzca la cancelación o la finalización de todo el proceso.When cancelling a task, ensure that the BackgroundActivated event handler exits before the cancellation occurs or the whole process will be terminated.
  • Escribe tareas en segundo plano de corta duración.Write background tasks that are short-lived. La mayoría de las tareas en segundo plano se limitan a 30 segundos de uso de reloj.Most background tasks are limited to 30 seconds of wall-clock usage.

Cosas que hay que evitarThings to avoid

  • Minimice el uso de la comunicación entre procesos a través de COM o RPC.Minimize the use of inter-process communication via COM or RPC.
  • Es posible que el proceso con el que intenta comunicarse no esté en un estado en ejecución, lo que puede dar lugar a un bloqueo.The process you are trying to communicate with may not be in a running state which can result in a hang.
  • Se puede dedicar una cantidad considerable de tiempo a facilitar la comunicación entre procesos y contará con el tiempo asignado para ejecutar la tarea en segundo plano.A significant amount of time could be spent facilitating cross process communication, and will count against the time allotted to run your background task.
  • No confíes en la interacción con el usuario en las tareas en segundo plano.Do not rely on user interaction in background tasks.