Otimize a atividade em segundo plano

As tarefas em segundo plano permitem que a sua aplicação execute código quando a aplicação não está em primeiro plano. Numa aplicação SDK de Aplicações Windows para desktop, a atividade em segundo plano tem mais flexibilidade do que nas aplicações UWP, mas deve geri-la de forma responsável para garantir uma boa experiência para os seus utilizadores.

Importante

As aplicações do SDK de Aplicações Windows para ambiente de trabalho não estão sujeitas às mesmas restrições de execução em segundo plano que as aplicações UWP. As aplicações para ambiente de trabalho podem executar linhas de execução em segundo plano livremente, manter tarefas de longa duração e usar os padrões de threading convencionais do .NET. No entanto, ser um bom cidadão do sistema significa minimizar o trabalho desnecessário quando o utilizador não está a usar ativamente a sua aplicação.

Melhores práticas para atividade em segundo plano

Siga estas orientações para manter a sua aplicação eficiente:

Reduza o trabalho quando o utilizador não está a interagir com a sua aplicação

Quando o utilizador mudar para outra aplicação ou minimizar a sua janela, reduza a frequência dos temporizadores, das sondagens de rede e de outros trabalhos em segundo plano. Isto poupa bateria e liberta recursos do sistema para a aplicação com que o utilizador está a trabalhar ativamente.

Utilize padrões de agendamento eficientes

Use agendamento baseado em temporizador em vez de ciclos de sondagem apertados. Para trabalhos periódicos, use DispatcherTimer ou System.Threading.Timer com intervalos adequados ao seu cenário.

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);
    }
}

Reagir aos estados de energia e da bateria

Verifique o estado de energia do sistema e ajuste o comportamento da sua aplicação em conformidade. Reduza a atividade em segundo plano quando o dispositivo funciona com bateria e considere adiar trabalhos não essenciais até o dispositivo estar ligado.

// 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.
}

Cancelar trabalho em segundo plano quando a aplicação fecha

Quando a sua aplicação for encerrada, cancele quaisquer tarefas em segundo plano ainda em execução recorrendo a padrões CancellationToken. Isto impede que a sua aplicação armazene recursos do sistema depois de deixarem de ser visíveis.

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();
}

Usar tarefas em segundo plano com identidade de pacote

Se a sua aplicação estiver equipada com MSIX, também pode registar tarefas em segundo plano que são executadas em resposta a gatilhos do sistema (como alterações no estado da rede, fusos horários ou presença de utilizadores). Estas tarefas utilizam a mesma BackgroundTaskBuilder API disponível no UWP. Para mais informações, consulte Apoiar a sua aplicação com tarefas em segundo plano.

Note

As aplicações empacotadas (MSIX) podem usar BackgroundTaskBuilder para tarefas acionadas pelo sistema. Aplicações de ambiente de trabalho não empacotadas devem usar padrões padrão de threading .NET em vez disso.