Ottimizzare l'attività in background

Le attività in background consentono all'app di eseguire codice quando l'app non è in primo piano. In un'applicazione desktop SDK per app di Windows, l'attività in background ha maggiore flessibilità rispetto alle app UWP, ma è comunque consigliabile gestirla in modo responsabile per garantire un'esperienza ottimale per gli utenti.

Importante

Le app desktop SDK per app di Windows non sono soggette alle stesse restrizioni di esecuzione in background delle app UWP. Le app desktop possono eseguire liberamente thread in background, gestire attività a esecuzione prolungata e usare modelli di threading standard .NET. Tuttavia, essere un buon cittadino del sistema significa ridurre al minimo il lavoro non necessario quando l'utente non usa attivamente l'app.

Procedure consigliate per l'attività in background

Seguire queste linee guida per mantenere efficiente l'app:

Ridurre il lavoro quando l'utente non interagisce con l'app

Quando l'utente passa a un'altra app o minimizza la finestra, riduci la frequenza dei timer, del polling di rete e di altre operazioni in background. Ciò consente di risparmiare batteria e libera le risorse di sistema per l'app con cui l'utente sta lavorando attivamente.

Usare modelli di pianificazione efficienti

Usare la pianificazione basata su timer anziché i cicli di polling ristretti. Per il lavoro periodico, usare DispatcherTimer o System.Threading.Timer con intervalli appropriati per lo scenario.

private DispatcherTimer _updateTimer;

private void MainWindow_Activated(object sender, WindowActivatedEventArgs args)
{
    if (args.WindowActivationState == WindowActivationState.Deactivated)
    {
        // Window is no longer active — slow down updates.
        _updateTimer.Interval = TimeSpan.FromSeconds(30);
    }
    else
    {
        // Window is active — use normal update rate.
        _updateTimer.Interval = TimeSpan.FromSeconds(2);
    }
}

Rispondere agli stati di alimentazione e batteria

Controllare lo stato di alimentazione del sistema e regolare il comportamento dell'app di conseguenza. Ridurre l'attività in background quando il dispositivo funziona a batteria e valutare se posticipare le attività non essenziali finché il dispositivo non viene collegato all'alimentazione.

// Check power status using Windows.System.Power
var batteryStatus = Windows.System.Power.PowerManager.BatteryStatus;
var energySaverStatus = Windows.System.Power.PowerManager.EnergySaverStatus;

if (energySaverStatus == Windows.System.Power.EnergySaverStatus.On)
{
    // Reduce background work when Battery Saver is active.
    DisableNonEssentialUpdates();
}

void DisableNonEssentialUpdates()
{
    // Pause non-essential timers, syncs, and animations here.
}

Annullare il lavoro in background alla chiusura dell'app

Quando l'app si arresta, annulla tutte le attività in background ancora in esecuzione usando i pattern CancellationToken. Ciò impedisce all'app di contenere le risorse di sistema dopo che non è più visibile.

private CancellationTokenSource _cts = new();

private async Task DoBackgroundWorkAsync()
{
    while (!_cts.Token.IsCancellationRequested)
    {
        await Task.Delay(TimeSpan.FromSeconds(10), _cts.Token);
        // Perform periodic work.
    }
}

private void MainWindow_Closed(object sender, WindowEventArgs args)
{
    _cts.Cancel();
}

Usare le attività in background con l'identità del pacchetto

Se l'app è in pacchetto con MSIX, puoi anche registrare le attività in background eseguite in risposta ai trigger di sistema (ad esempio modifiche dello stato della rete, fusi orari o presenza dell'utente). Queste attività usano la stessa BackgroundTaskBuilder API disponibile in UWP. Per altre informazioni, vedi Supportare l'app con le attività in background.

Note

Le app pacchettizzate (MSIX) possono usare BackgroundTaskBuilder per attività avviate dal sistema. Le app desktop non in pacchetto devono usare invece modelli di threading standard .NET.