Tareas en segundo plano y desencadenadores personalizados
Las tareas en segundo plano son un método en Windows 10 para ejecutar código en segundo plano. Forman parte de la plataforma de aplicaciones estándar y básicamente proporcionan a una aplicación la capacidad de registrarse para un evento del sistema (desencadenador) y cuando ese evento se produce ejecuta un bloque predefinido de código en segundo plano. Los desencadenadores del sistema incluyen eventos como cambios en la conectividad de red o en la zona horaria del sistema.
En algunas circunstancias, los desencadenadores del sistema proporcionados no son suficientes para abordar escenarios de asociados. A partir de Windows 10 versión 1803, para ofrecer a los asociados más flexibilidad y permitir el uso de tareas en segundo plano para más circunstancias, los asociados pueden crear desencadenadores personalizados para los que las aplicaciones se puedan registrar. Los desencadenadores personalizados se definen dentro de un controlador de dispositivo y se pueden usar para generar eventos para cualquier condición de hardware que desee. Cuando se genera el desencadenador personalizado, la aplicación puede ejecutar una tarea en segundo plano exactamente de la misma manera que el modelo de aplicación estándar.
Implementación de un desencadenador personalizado
Hay dos pasos para implementar un desencadenador personalizado. En concreto, el desencadenador debe definirse y generarse dentro de un controlador de dispositivo o servicio del sistema y se debe crear una aplicación con una tarea en segundo plano.
Creación del desencadenador personalizado
Un desencadenador personalizado se define y genera dentro de un servicio nativo o controlador de dispositivo a través de la función RtlRaiseCustomSystemEventTrigger . Después, se puede registrar desde una aplicación universal y usarse para iniciar una tarea en segundo plano de la misma manera que un desencadenador definido por el sistema.
En el fragmento de código siguiente se muestra cómo generar un desencadenador personalizado.
#define GUID_MY_CUSTOMSYSTEMEVENTTRIGGERID L"{9118718B-FF80-4AFE-BAF1-D88A4525F3AB}"
CUSTOM_SYSTEM_EVENT_TRIGGER_CONFIG triggerConfig;
CUSTOM_SYSTEM_EVENT_TRIGGER_INIT(&triggerConfig,
GUID_MY_CUSTOMSYSTEMEVENTTRIGGERID);
NTSTATUS status = RtlRaiseCustomSystemEventTrigger(&triggerConfig);
En el ejemplo de código anterior, el GUID pasado como parámetro a la función RtlRaiseCustomSystemEventTrigger define el identificador del desencadenador para el que se registrará la aplicación al crear la tarea en segundo plano. Este identificador debe ser único.
Creación de una tarea en segundo plano
Crear una tarea en segundo plano y registrarla para un desencadenador personalizado es muy similar al proceso utilizado para las tareas en segundo plano que funcionan con los desencadenadores del sistema estándar.
Empiece por crear una aplicación para UWP.
Defina la tarea en segundo plano en el archivo de manifiesto de la aplicación como se muestra en el ejemplo siguiente. Tenga en cuenta que el atributo Type del elemento Task está establecido en
"systemEvent"
<Applications> <Application Id="MyBackgroundTaskSample.App" Executable="$targetnametoken$.exe" EntryPoint=" MyBackgroundTaskSample.App"> <Extensions> <Extension Category="windows.backgroundTasks" EntryPoint="MyBackgroundTask.SampleBackgroundTask"> <BackgroundTasks> <Task Type="systemEvent" /> </BackgroundTasks> </Extension> </Extensions> </Application> </Applications>
Registre la aplicación para escuchar el desencadenador personalizado que creó, tal como se muestra en el siguiente fragmento de código. Tenga en cuenta que la cadena usada al crear una instancia de CustomSystemEventTrigger debe coincidir con el GUID usado al crear el desencadenador en el servicio nativo o en el controlador de dispositivo.
public void InitBackgroundTask() { // Create a new background task builder. BackgroundTaskBuilder taskBuilder = new BackgroundTaskBuilder(); // Create a new CustomSystemEvent trigger. var myTrigger = new CustomSystemEventTrigger( "{9118718B-FF80-4AFE-BAF1-D88A4525F3AB}", //Trigger Identifier CustomSystemEventTriggerRecurrence.Once); //OneShot // Associate the CustomSystemEvent trigger with the background task builder. taskBuilder.SetTrigger(myTrigger); // Specify the background task to run when the trigger fires. taskBuilder.TaskEntryPoint = MyBackgroundTask.SampleBackgroundTask; // Name the background task. taskBuilder.Name = "fabrikam.audio-jack.connected Task"; // Register the background task. BackgroundTaskRegistration taskRegistration = taskBuilder.Register(); // Associate completed event handler with the new background task. taskRegistration.Completed += new BackgroundTaskCompletedEventHandler(OnCompleted); }
Cree la tarea en segundo plano como se muestra en el siguiente fragmento de código.
namespace MyBackgroundTask { public sealed class SampleBackgroundTask : IBackgroundTask { // Called by the system when it's time to run our task public void Run(IBackgroundTaskInstance instance) { DoWork(); } } }
Para obtener instrucciones adicionales sobre cómo crear, configurar y trabajar con tareas y desencadenadores en segundo plano, consulte Inicio rápido: Creación y registro de una tarea en segundo plano.