Palestra sobre Live Tiles e Background executions em Windows Universal Platform. Ministrada pelos evangelistas Diego Castro e João Ronaldo Cunha no The Developer Conference (TDC) São Paulo 2015 na trilhe de Universal Windows.
1. Globalcode – Open4education
Trilha – Universal Windows
Diego Castro | João Ronaldo
Evangelistas Técnicos
www.talkitbr.com
Live Tiles e Background Execution
2. Globalcode – Open4education
Diego Castro
/dfdcastro
www.talkitbr.com
/talkitbr
João Ronaldo Cunha
/joaoronaldo.cunha
www.talkitbr.com
/talkitbr /joaocunhaeld
5. Globalcode – Open4education
Live State
Plate
App Icon
Short Name
Badge
Content
Plate
Short Name
Badge
App Icon
Content
Anatomia
Semi-Live State
Plate
App Logo
Short Name
Badge
Plate
App Logo
Short Name
Badge
Basic State
Plate
App Logo
Short Name
Plate
App Logo
Short Name
15. Globalcode – Open4education
O que é
Tarefa que executa em plano de fundo
(background)
Permite executar código da aplicação mesmo
quando ela não estiver em execução.
Usado para:
Atualização de Live Tiles;
Notificações;
Atualização de banco de dados;
Entre outros.
16. Globalcode – Open4education
Criando Background Task
Implementar interface IBackgroundTask
Analisar custo
O SO está sobrecarregado? Vale a pena executar o
background task num determinado momento?
Tratar o cancelamento da task
Toda background task pode ser cancelada
Executar em deferral
Background task não pode executar de forma
assíncrona.
Indicar progresso
17. Globalcode – Open4education
Criando Background Task
public async void Run(IBackgroundTaskInstance taskInstance)
{
var cost = BackgroundWorkCost.CurrentBackgroundWorkCost;
if (cost == BackgroundWorkCostValue.High)
{
return;
}
var cancel = new System.Threading.CancellationTokenSource();
taskInstance.Canceled += (s, e) =>
{
cancel.Cancel();
cancel.Dispose();
};
var deferral = taskInstance.GetDeferral();
try
{
await Task.Run(async () =>
{
for (int i = 0; i < 10; i++)
{
taskInstance.Progress = (uint)i * 10;
await Task.Delay(2000);
}
}, cancel.Token);
}
finally
{
deferral.Complete();
}
}
Analisar Custo
18. Globalcode – Open4education
Criando Background Task
public async void Run(IBackgroundTaskInstance taskInstance)
{
var cost = BackgroundWorkCost.CurrentBackgroundWorkCost;
if (cost == BackgroundWorkCostValue.High)
{
return;
}
var cancel = new System.Threading.CancellationTokenSource();
taskInstance.Canceled += (s, e) =>
{
cancel.Cancel();
cancel.Dispose();
};
var deferral = taskInstance.GetDeferral();
try
{
await Task.Run(async () =>
{
for (int i = 0; i < 10; i++)
{
taskInstance.Progress = (uint)i * 10;
await Task.Delay(2000);
}
}, cancel.Token);
}
finally
{
deferral.Complete();
}
}
Tratar cancelamento
19. Globalcode – Open4education
Criando Background Task
public async void Run(IBackgroundTaskInstance taskInstance)
{
var cost = BackgroundWorkCost.CurrentBackgroundWorkCost;
if (cost == BackgroundWorkCostValue.High)
{
return;
}
var cancel = new System.Threading.CancellationTokenSource();
taskInstance.Canceled += (s, e) =>
{
cancel.Cancel();
cancel.Dispose();
};
var deferral = taskInstance.GetDeferral();
try
{
await Task.Run(async () =>
{
for (int i = 0; i < 10; i++)
{
taskInstance.Progress = (uint)i * 10;
await Task.Delay(2000);
}
}, cancel.Token);
}
finally
{
deferral.Complete();
}
}
Executar em deferral
20. Globalcode – Open4education
Criando Background Task
public async void Run(IBackgroundTaskInstance taskInstance)
{
var cost = BackgroundWorkCost.CurrentBackgroundWorkCost;
if (cost == BackgroundWorkCostValue.High)
{
return;
}
var cancel = new System.Threading.CancellationTokenSource();
taskInstance.Canceled += (s, e) =>
{
cancel.Cancel();
cancel.Dispose();
};
var deferral = taskInstance.GetDeferral();
try
{
await Task.Run(async () =>
{
for (int i = 0; i < 10; i++)
{
taskInstance.Progress = (uint)i * 10;
await Task.Delay(2000);
}
}, cancel.Token);
}
finally
{
deferral.Complete();
}
}
Indicar progresso
21. Globalcode – Open4education
Requisitando Acesso
A aplicação precisa requisitar acesso para rodar
Background Tasks
O Windows 10 não exibe mais a caixa de diálogo,
assim como já era no Windows Phone 8.1.
BackgroundAccessStatus allowed = await BackgroundExecutionManager.RequestAccessAsync();
switch (allowed)
{
// allowed
case BackgroundAccessStatus.AllowedMayUseActiveRealTimeConnectivity: break;
case BackgroundAccessStatus.AllowedWithAlwaysOnRealTimeConnectivity: break;
// denied
case BackgroundAccessStatus.Denied: break;
// cancelled
case BackgroundAccessStatus.Unspecified: break;
}
22. Globalcode – Open4education
Registrando a Task
Registramos a Background Task usando o
BackgroundExecutionManager.
Neste momento definimos o trigger e as condições
para rodar a background task.
var task = new BackgroundTaskBuilder
{
Name = nameof(MyBackgroundTask),
CancelOnConditionLoss = false,
TaskEntryPoint = typeof(MyBackgroundTask).ToString(),
};
task.SetTrigger(new SystemTrigger(SystemTriggerType.InternetAvailable, false));
task.AddCondition(new SystemCondition(SystemConditionType.userPresent));
task.Register();
23. Globalcode – Open4education
Especificando no manifest
No manifest da aplicação registramos uma
extensão da aplicação definindo nossa Task.
Atenção para os tipos definidos para o Background
Task.
<Applications>
<Application Id="App"
<Extensions>
<Extension Category="windows.backgroundTasks" EntryPoint="SampleApp.Tasks.MyBackgroundTask">
<BackgroundTasks>
<Task Type="systemEvent" />
<!-- <Task Type="timer" /> -->
</BackgroundTasks>
</Extension>
</Extensions>
</Application>
</Applications>
25. Globalcode – Open4education
Executando a Task
A execução de um Background Task é
determinada:
Por trigger.
Por zero ou mais condições.
Posso registrar uma task com diferentes triggers e
diferentes condições.
27. Globalcode – Open4education
Executando a Task
Triggers -Time Trigger
Time Trigger deve ter ao menos 15 minutos para
ser recorrente.
Definir trigger menor faz com que ele seja
executado somente uma vez.
// ...
task.SetTrigger(new TimeTrigger(15, false));
task.AddCondition(new SystemCondition(SystemConditionType.UserPresent));
task.Register();
// ...
28. Globalcode – Open4education
Executando a Task
Condições do Sistema
User Present
User Not Present
Internet Available
Internet Not Available
Session Connected
Session Disconnected
Free Network Available
Se a rede não tem taxa
para tráfego de dados
Work Cost Not High
29. Globalcode – Open4education
Tempo Execução da Task
Cancel
(5 seconds)
Memory
Run
(25 seconds)
Default tasks
Mínimo 25 segundos de
execução
5 segundos após receber
sinal de cancelamento.
Memory
Run
(no end)
End
(no warning, for now)
Long-running tasks
Inclui triggers: Application,
Maintenance e DeviceUse
30. Globalcode – Open4education
Debug e Log
Visual Studio pode disparar background tasks.
Log é registrado em:
Application & Services Logs > Microsoft >
BackgroundTaskInfrastructure
31. Globalcode – Open4education
Restrições
Cota de CPU = Não
Processamento CPU = Sim (10%)
Tempo mínimo execução = Sim (25s + 5s)
Exceto para long-running tasks
Cota de memória = Sim
Varia de acordo com o dispositivo (min 16MB)
Cota de tráfego de rede = Sim
Varia de acordo com o dispositivo
32. Globalcode – Open4education
Restrições
No Windows 10 uma aplicação pode ter muitas
background tasks.
Seja consciente! Executar várias background tasks
pode prejudicar a experiência do usuário.
33. Globalcode – Open4education
Restrições
Quiet hours
Somente quando não estiver sendo usado pelo usuário.
Não são emitidas notificações
Nenhuma background task é executada
Tarefas em andamento são canceladas
35. Globalcode – Open4education
Outros Recursos
In-process Task
Processo padrão
Background task
mantido num processo
a parte
In-process
Maior comunicação
entre app e task
Memória compartilhada
app.exe
Core
Application
Background
Task
task.exe
App Container
app.exe
Core
Application
Background
Task
task.exe
App Container
- Explicar como é formado um Tile
Explicar os 3 tipos de tiles
Basic State
Semi-Live State
Live State
Basic Templates
Templates prontos, com posições dos elementos fixas
Explicar que se o template que existe funciona para ele, é melhor usar.
Os templates do Windows 8.1 ainda funcionam no 10 sem nenhum problema
Explicar o que é o Secondary Live Tile
Explicar quando deve usar esse recurso
- Explicar os tipos de atualizações que são possíveis
Mostrar como é o código incial de cada tamanho de tamplate disponível
Falar que o Tile Large é exclusivo Desktop
Mostrar exemplos de tiles
Mostrar como é simples e fácil deixar um Tile customizado de acordo com as necessidades do aplicativo
Pode ser causado por falta de recursos do SO.
Diego: Qual a importancia do Deferral? E se eu nao usar?
Ao executar uma tarefa assíncrona no Background Task, o SO pode considerar a task como finalizada e teminá-la. Usar deferral garante que a Task não será finalizada pelo SO.
O deferral.Complete() sinaliza o SO que a background task terminou o que tinha para fazer.
Ao executar uma tarefa assíncrona no Background Task, o SO pode considerar a task como finalizada e teminá-la. Usar deferral garante que a Task não será finalizada pelo SO.
O deferral.Complete() sinaliza o SO que a background task terminou o que tinha para fazer.
O usuário pode prevenir a execução de um background task (app or system level). Mas ele não pode impedir que a aplicação faça a requisição de acesso. Não é esse o caso aqui.
O usuário pode negar a execução de background tasks, por exemplo, devido a problemas com a aplicação ou por causa do estado atual do SO.
Para registrar o Background Task usamos o método: Task.register()
Para tanto definimos a Task a partir do BackgroundTaskBuilder. Neste definimos as seguintes informações:
- Name: deve ser único. Podemos usar o recurso novo do C#5 que é o nameof. O nome será depois usado para acompanhar a Background Task no event viewer.
- CancelOnConditionLoss: Nós podemos executar a task mesmo quando perdermos a condição para executar a background task.
- EntryPoint: O nome complete do background task.
E importante especificar o type correto para a tarefa. Voce pode especificar mais de um element Task dentro do element BackgroundTasks, cada um especificando os tipos que devem corresponder com os triggers da task.
Diego: Questionar se as triggers do 8.1 ainda funcionam no 10
Diego: O usuario ficou 15 min sem estar logado, acionou o trigger, passou mais 15 min e ele nao logou. Quando logar vai ser enviado quantas vezes?
Diego: Sempre vou ter 25 segundos?
No Windows desktop podemos ter até 8 background tasks executando simultâneamente.
Isso pode ser diferente no Windows Mobile.
Em Quite Hours ainda estão disponíveis Toast VOIP e Toast Alarm
Em Quite Hours ainda estão disponíveis Toast VOIP e Toast Alarm