Linguaggio: HTML | XAML

Come gestire attività in background inattive o bloccate

Applies to Windows and Windows Phone

Le attività in background inattive possono causare l'interruzione non necessaria dell'app. Per gestire le attività in background inattive o bloccate, è necessario gestire l'annullamento e chiudere completamente l'attività in background.

Le attività in background devono essere operazioni di breve durata che vengono completate rapidamente e restituiscono il controllo all'app. Tale comportamento è obbligatorio a causa dei vincoli restrittivi sulle risorse di rete e CPU a cui sono soggette le attività in background. Le attività in background costituiscono l'unico strumento supportato per eseguire codice in background mentre l'app è sospesa e durante lo standby connesso. I vincoli sull'utilizzo delle risorse hanno lo scopo di limitare il possibile impatto dell'attività in background sulla durata della batteria.

Per applicare tali vincoli, un'infrastruttura apposita rileva le attività in background che risultano inattive o hanno smesso di rispondere. Se una determinata attività in background non utilizza una quantità minima della quota di risorse di rete o CPU entro un intervallo di tempo minimo, l'attività in background viene considerata inattiva o bloccata. L'intervallo di tempo minimo varia a seconda dello stato del sistema, ad esempio se si trova in stato di standby connesso. Quando viene rilevata un'attività in background inattiva o bloccata, a quest'ultima viene inviata una notifica di annullamento per offrirle l'opportunità di terminare correttamente. Se l'attività in background non risponde alla notifica di annullamento terminando completamente entro 5 secondi, l'app viene considerata bloccata e viene interrotta automaticamente dal sistema. In questo caso viene generato un report con i dettagli dell'arresto anomalo per Segnalazione errori Windows, disponibile nell'account sviluppatore di Windows Store.

In genere le attività in background risultano inattive o bloccate quando rimangono in attesa del completamento di un'operazione asincrona nel metodo Run(), ad esempio quando rimangono in attesa di una risposta su un socket di rete o del termine di una lunga operazione di copia dei file mentre il disco non risponde. Per gestire correttamente l'annullamento dell'attività in background anche mentre è in attesa di un'operazione asincrona, esegui questa procedura.

Cosa sapere

Tecnologie

Prerequisiti

  • Questo argomento è applicabile alle app con attività in background.

Istruzioni

Passaggio 1: Registra un gestore di annullamento

Registra sempre un gestore di annullamento per l'attività in background. Se il sistema rileva che l'attività in background è inattiva o bloccata, chiama il gestore di annullamento. L'attività in background deve disporre di un gestore di annullamento, che deve provocarne la chiusura completa entro 5 secondi. In caso contrario l'app viene terminata automaticamente.

Passaggio 2: Annulla le operazioni asincrone

Alcune attività risultano inattive quando sono in attesa di operazioni asincrone create nel metodo Run(). Per annullare con facilità tutte le operazioni asincrone in sospeso, puoi associare un singolo oggetto CancellationTokenSource a tutte le operazioni asincrone. Dal gestore di annullamento puoi quindi chiamare Cancel sull'oggetto CancellationTokenSource per annullare tutte le operazioni asincrone in sospeso.

Passaggio 3: Completa il differimento delle attività in background

In C#/C++/VB le attività in background devono sempre chiamare Complete() sull'oggetto di differimento delle attività in background al termine delle proprie operazioni, per consentire l'arresto dell'attività. Se non si chiama Complete() sull'oggetto di differimento delle attività in background per chiuderla, l'infrastruttura delle attività in background rileva l'attività quando diviene inattiva e le invia una notifica di annullamento.

Osservazioni

Procedure consigliate per le attività in background inattive o bloccate

Per gestire le attività in background inattive o bloccate, puoi usare le seguenti procedure consigliate.

  1. Associa sempre un gestore di annullamento per l'attività in background.
  2. Nel gestore di annullamento annulla tutte le operazioni asincrone e restituisci il controllo entro 5 secondi. In caso contrario l'app verrà interrotta.
  3. Chiama sempre Complete() sull'oggetto di differimento delle attività in background appena prima di chiudere l'attività C#/C++/VB in background.

Codice di esempio

La seguente attività in background registra un gestore di annullamento, annulla le operazioni asincrone e chiama Complete().


public sealed class ExampleClass:IBackgroundTask
{
    CancellationTokenSource cancelTokenSource = new CancellationTokenSource();

    async void Run(IBackgroundTaskInstance taskInstance)
    {
        BackgroundTaskDeferral deferral = taskInstance.GetDeferral();
        HostName server = new HostName("contoso.com");
        StreamSocket sock = new StreamSocket();
        
        // Skipping other extraneous code.
        
        // Associate a cancellation handler with the background task.
        taskInstance.Canceled += new BackgroundTaskCanceledEventHandler(OnCanceled);

        try
        {    
            await sock.ConnectAsync(server, "http").AsTask(cancelTokenSource.Token);
            await sock.InputStream.ReadAsync(…).AsTask(cancelTokenSource.Token);                   
        }
        finally { deferral.Complete(); }
    }
    

    private void OnCanceled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason)
    {
        // The background task has been detected as idle or hung.
        // Cancel all pending async operations and return from the task.
        cancelTokenSource.Cancel(); 
    }
}


Argomenti correlati

Come gestire un'attività in background annullata

 

 

Mostra:
© 2014 Microsoft