Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
As tarefas em segundo plano são muito usadas em aplicativos UWP para executar trabalhos quando um determinado gatilho é invocado na máquina. Como estes não requerem nenhum serviço para estar ativo e a escutar os gatilhos, são muito eficientes em termos de energia. Assim, ao migrar aplicações UWP para o WinUI 3 e outras aplicações de ambiente de trabalho que utilizam o SDK de Aplicações Windows, os programadores podem necessitar de suporte para implementar tarefas em segundo plano na plataforma.
As tarefas em plano de fundo oferecidas no modelo de aplicação UWP podem ser executadas fora do processo (out-of-proc) ou dentro do processo (in-proc). Este artigo descreve a estratégia de migração para cada um destes tipos ao migrar para APIs BackgroundTaskBuilder em SDK de Aplicações Windows.
Tarefas em segundo plano fora do processo
No caso de tarefas em segundo plano fora do processo no UWP, as tarefas em segundo plano serão escritas como um componente Windows Runtime (WinRT), e o componente é definido como TaskEntryPoint em BackgroundTaskBuilder durante o registo. Durante a migração para o SDK de Aplicações Windows, os programadores podem manter isto como está e empacotar o componente WinRT juntamente com o projeto de ambiente de trabalho. Nesse caso, a infraestrutura do broker iniciará o processo backgroundtaskhost quando o gatilho for invocado, e então a tarefa em segundo plano do componente WinRT será executada no mesmo processo. Nesta abordagem, a tarefa em segundo plano estaria a correr num processo de Baixo Nível de Integridade (IL) (backgroundtaskhost.exe), enquanto o projeto principal do ambiente de trabalho estaria a correr num processo de Nível de Integridade Médio (IL).
Se o aplicativo precisar executar uma tarefa em segundo plano em um processo IL médio em si, o componente COM de confiança total precisará ser usado para tarefas em segundo plano. Nesse cenário, os programadores devem usar o SDK de Aplicações Windows BackgroundTaskBuilder para registar o componente COM de confiança total. Note que a API BackgroundTaskBuilder do namespace Windows.ApplicationModel.Background lançará exceções durante o registo de alguns disparadores.
Um exemplo completo de registo de tarefas em segundo plano do WinUI pode ser encontrado em GitHub.
Mais detalhes sobre a implementação estão disponíveis em Criar e registar uma tarefa em segundo plano com Win32. A única alteração necessária seria substituir a API WinRT BackgroundTaskBuilder pela API SDK de Aplicações Windows Microsoft.Windows. ApplicationModel.Background.BackgroundTaskBuilder. Para exemplos de código de registo, consulte a secção SDK de Aplicações Windows BackgroundTaskBuilder API abaixo.
Tarefas em segundo plano no processo
Para tarefas em segundo plano no processo em UWP, as rotinas para essas tarefas são implementadas no retorno de chamada OnBackgroundActivated, que é executado como parte do processo em primeiro plano. Isto não será possível numa aplicação WinUI, pois os callbacks OnBackgroundActivated não estão disponíveis. O aplicativo precisa mover as implementações de tarefas em segundo plano para tarefas COM de confiança total, conforme descrito acima, e definir o servidor COM no manifesto do pacote para lidar com a ativação COM da tarefa. Quando o gatilho ocorre, a ativação COM acontecerá no COM Coclass correspondente registrado para o gatilho.
Um exemplo completo de registo de tarefas em segundo plano do WinUI pode ser encontrado em GitHub.
Mais detalhes sobre a implementação estão disponíveis em Criar e registar uma tarefa em segundo plano com Win32. A única alteração seria substituir a API WinRT BackgroundTaskBuilder pelas APIs SDK de Aplicações Windows no Microsoft.Windows. ApplicationModel.Background.BackgroundTaskBuilder.
SDK de Aplicações Windows API BackgroundTaskBuilder
Existem duas versões diferentes da API BackgroundTaskBuilder . A API Windows.ApplicationModel.BackgroundTaskBuilder foi projetada para aplicações UWP e muitos dos gatilhos de tarefas em segundo plano não são suportados para componentes COM de confiança absoluta. Eles são suportados somente quando registrados com componentes do WinRT que são iniciados com um processo de backgroundtaskhost. Devido a isto, as aplicações de ambiente de trabalho do SDK de Aplicações Windows não conseguem registar diretamente os componentes COM de confiança total para serem lançados com gatilhos de tarefas em segundo plano. Exigem uma solução alternativa para incluir os componentes WinRT no project. A API Microsoft.Windows.ApplicationModel.BackgroundTaskBuilder incluída no SDK de Aplicações Windows evita este recurso alternativo, permitindo que o WinUI 3 e outras aplicações de ambiente de trabalho que utilizem o SDK de Aplicações Windows possam registar os componentes COM de confiança plena diretamente em tarefas de fundo.
O seguinte código mostra como registar tarefas em segundo plano usando APIs SDK de Aplicações Windows BackgroundTaskBuilder:
//Using Windows App SDK API for BackgroundTaskBuilder
winrt::Microsoft::Windows::ApplicationModel::Background::BackgroundTaskBuilder builder;
SystemTrigger trigger = SystemTrigger(SystemTriggerType::TimeZoneChange, false);
auto backgroundTrigger = trigger.as<IBackgroundTrigger>();
builder.SetTrigger(backgroundTrigger);
builder.AddCondition(SystemCondition(SystemConditionType::InternetAvailable));
builder.SetTaskEntryPointClsid(classGuid);
builder.Register();
O seguinte é o código C# equivalente:
// Using Windows App SDK API for BackgroundTaskBuilder
var builder = new Microsoft.Windows.ApplicationModel.Background.BackgroundTaskBuilder();
var trigger = new SystemTrigger(SystemTriggerType.TimeZoneChange, false);
builder.SetTrigger(trigger);
builder.AddCondition(new SystemCondition(SystemConditionType.InternetAvailable));
builder.SetTaskEntryPointClsid(classGuid);
builder.Register();
Para usar esta API, adicione a etiqueta abaixo ao ficheiro do projeto para permitir tarefas em segundo plano do SDK de Aplicações Windows:
<WindowsAppSDKBackgroundTask>true</WindowsAppSDKBackgroundTask>
Além disso, no ficheiro manifesto, o EntryPoint para BackgroundTask está definido para Microsoft.Windows.ApplicationModel.Background.UniversalBGTask.Task:
<Extension Category="windows.backgroundTasks" EntryPoint="Microsoft.Windows.ApplicationModel.Background.UniversalBGTask.Task">
<BackgroundTasks>
<Task Type="general"/>
</BackgroundTasks>
</Extension>
Para aplicações C#, um registro de ActivatableClass também deve ser adicionado ao arquivo de manifesto:
<Extension Category="windows.activatableClass.inProcessServer">
<InProcessServer>
<Path>Microsoft.Windows.ApplicationModel.Background.UniversalBGTask.dll</Path>
<ActivatableClass ActivatableClassId="Microsoft.Windows.ApplicationModel.Background.UniversalBGTask.Task" ThreadingModel="both"/>
</InProcessServer>
</Extension>
Aproveitando o TaskScheduler para migração de tarefas em segundo plano
O Agendador de Tarefas ajuda os aplicativos da área de trabalho a obter a mesma funcionalidade fornecida pelo BackgroundTaskBuilder em aplicativos UWP. Mais detalhes sobre implementações que utilizam o TaskScheduler estão disponíveis na referência da API do Task Scheduler.
Utilização do ApplicationTrigger em aplicações do SDK de Aplicações Windows
ApplicationTrigger é suportado em aplicações UWP devido ao cenário de gestão do ciclo de vida em que o processo da aplicação pode ser suspenso. Este cenário não ocorre para aplicações de ambiente de trabalho do WinUI e outras aplicações do SDK de Aplicações Windows, pelo que este gatilho não é suportado em aplicações WinUI. Toda a lógica relacionada a ApplicationTrigger precisará ser reescrita para ser executada iniciando outro processo ou executando em um thread de pool de threads. Para obter mais informações, consulte CreateThread e CreateProcess.
Conteúdo relacionado
- Usar tarefas em segundo plano em Windows apps
- BackgroundTaskBuilder
Windows developer