Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
As tarefas em segundo plano permitem que seu aplicativo execute o código quando o aplicativo não estiver em primeiro plano. Em um aplicativo de desktop do SDK do Aplicativo Windows, a atividade em segundo plano tem mais flexibilidade do que em aplicativos UWP, mas você ainda deve gerenciá-la com responsabilidade para garantir uma boa experiência aos seus usuários.
Importante
Os aplicativos de SDK do Aplicativo Windows da área de trabalho não estão sujeitos às mesmas restrições de execução em segundo plano que os aplicativos UWP. Os aplicativos da área de trabalho podem executar livremente threads em segundo plano, manter tarefas de longa duração e usar os padrões padrão de threading do .NET. No entanto, ser um bom cidadão do sistema significa minimizar o trabalho desnecessário quando o usuário não estiver usando ativamente seu aplicativo.
Práticas recomendadas para atividade em segundo plano
Siga estas diretrizes para manter seu aplicativo eficiente:
Reduzir o trabalho quando o usuário não estiver interagindo com seu aplicativo
Quando o usuário alterna para um aplicativo diferente ou minimiza sua janela, reduza a frequência de temporizadores, sondagem de rede e outros trabalhos em segundo plano. Isso conserva a bateria e libera recursos do sistema para o aplicativo com o qual o usuário está trabalhando ativamente.
Usar padrões de agendamento eficientes
Use o agendamento baseado em temporizador em vez de loops de sondagem apertados. Para trabalho periódico, use DispatcherTimer ou System.Threading.Timer com intervalos apropriados para 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 status de energia do sistema e ajuste o comportamento do aplicativo adequadamente. Reduza a atividade em segundo plano quando o dispositivo estiver funcionando com bateria e considere adiar tarefas não essenciais até que o dispositivo esteja conectado à energia.
// 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 o trabalho em segundo plano quando o aplicativo for fechado
Quando o aplicativo for encerrado, cancele todas as tarefas restantes em segundo plano usando padrões CancellationToken. Isso impede que seu aplicativo mantenha os recursos do sistema depois que ele não estiver mais visível.
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 a identidade do pacote
Se o aplicativo estiver empacotado com MSIX, você também poderá registrar tarefas em segundo plano executadas em resposta a gatilhos do sistema (como alterações de estado de rede, fusos horários ou presença do usuário). Essas tarefas usam a mesma BackgroundTaskBuilder API disponível na UWP. Para obter mais informações, consulte Suporte ao aplicativo com tarefas em segundo plano.
Note
Aplicativos empacotados (MSIX) podem usar BackgroundTaskBuilder para tarefas acionadas pelo sistema. Aplicativos de área de trabalho não empacotados devem usar os padrões de thread do .NET.
Conteúdo relacionado
Windows developer