Il Windows Runtime mette a disposizione una serie di API che permettono alle nostre app di operare in background. All'interno di WinRT l'esecuzione in background è coordinata da una serie di regole che riguardano le risorse che ogni task può occupare e la particolare condizione di sistema che scatena l'esecuzione di quel task. Tuttavia queste restrizioni rischiano di essere un problema quando la nostra app ha bisogno di comunicare in maniera continua con un dispositivo per un lasso di tempo indefinito, come nel caso di una app per il Microsoft Band che monitora il nostro battito cardiaco in tempo reale. In questo particolare caso WinRT ci aiuta mettono a disposizione un particolare trigger, il DeviceUseTrigger.
Il DeviceUseTrigger è un particolare tipo di evento che una Windows Runtime App può scatenare per iniziare una time-consuming activity in background con un dispositivo o sensore, anche quando la nostra applicazione è sospesa.
Di seguito un esempio che mostra come registrare un background task che usa il DeviceUseTrigger come evento di sistema.
public static async Task<bool> RegisterLongRunningTask(string taskName)
{
bool result = false;
try
{
var access = await BackgroundExecutionManager.RequestAccessAsync();
if ((access == BackgroundAccessStatus.AllowedMayUseActiveRealTimeConnectivity) ||
(access == BackgroundAccessStatus.AllowedWithAlwaysOnRealTimeConnectivity))
{
var taskBuilder = new BackgroundTaskBuilder { Name = "LongRunningTask", TaskEntryPoint = taskName };
var deviceUseTrigger = new DeviceUseTrigger();
taskBuilder.SetTrigger(deviceUseTrigger);
taskBuilder.Register();
var rfcommServiceId = RfcommServiceId.FromUuid(new Guid("555AB828-7175-4709-A281-59A5C45A16E3"));
var selector = RfcommDeviceService.GetDeviceSelector(rfcommServiceId);
var deviceInformationCollection = await DeviceInformation.FindAllAsync(selector);
var device = deviceInformationCollection.FirstOrDefault();
var triggerResult = await deviceUseTrigger.RequestAsync(device.Id);
switch (triggerResult)
{
case DeviceTriggerResult.DeniedByUser:
throw new InvalidOperationException("Access denied by user.");
case DeviceTriggerResult.DeniedBySystem:
throw new InvalidOperationException("Access denied by system.");
case DeviceTriggerResult.LowBattery:
throw new InvalidOperationException("Low battery.");
}
result = true;
}
}
catch (Exception)
{
// It worked on my machine :)
}
return result;
Il codice risulta abbastanza semplice e intuitivo. Una volta ottenuto l'accesso all'esecuzione in background andiamo a creare e poi registrare un background task impostando come trigger una istanza del DeviceUseTrigger. Fatto questo andiamo a recuperare l'identificativo della periferica con cui vogliamo comunicare (in questo caso una periferica Bluetooth) e diamo in pasto al metodo. RequestAsync() il GUID recuperato.
Il metodo restituirà un DeviceTriggerResult che indicherà il risultato dell'operazione. Se l'operazione sarà andata a buon fine e il device risulta essere già connesso al vostro dispositivo ricevente il background task verrà avviato e inizierà a lavorare per un indeterminato periodo di tempo.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Costruire endpoint SSE in ASP.NET Core
Raggruppamento degli aggiornamenti di dipendenze tra directory in un monorepo con Dependabot
Building Custom Developer Agents
Cache temporanea in Javascript con oggetti
Integrare OpenTelemetry direttamente in Azure Monitor
Utilizzare i command service nei test con .NET Aspire
Keynote .NET Conference Italia 2025
Ricerca delle GitHub issue tramite operatori logici
Utilizzare ExecuteUpdate per aggiornare colonne JSON in Entity Framework
Configurare OpenTelemetry per Application Insights su ASP.NET Core
Blue/Green Release in locale con .NET Aspire
Gestione ciclo di vita in .NET Aspire
I più letti di oggi
- Leggere i parametri da riga di comando in una file based app .NET
- Building Custom Developer Agents
- Build 2015: segui con noi tutte le novità per gli sviluppatori in diretta da San Francisco
- Build 2014: tutte le novità per gli sviluppatori in diretta da San Francisco
- Build 2016: segui con noi in live streaming!


