Pergunta

Estou tentando registrar uma tarefa em segundo plano e estou tendo um comportamento estranho.Parece que a tarefa em si está sendo registrada e disparada na hora certa;no entanto, quando ele é acionado, meu programa está sendo encerrado (sem erros).

Suspeito que o motivo esteja relacionado ao fato de o programa não estar me perguntando se desejo permitir que uma tarefa em segundo plano seja executada quando eu iniciar.Criei uma declaração para a tarefa em segundo plano como um evento do sistema e estou registrando assim no App.Xaml.cs:

var builder = new BackgroundTaskBuilder();

builder.Name = "NewTask";
builder.TaskEntryPoint = "ConnectionMonitor.CheckInternet";
builder.SetTrigger(new SystemTrigger(SystemTriggerType.InternetAvailable, false));

BackgroundTaskRegistration task = builder.Register();

Então, acredito que minha pergunta seja:por que ele não me pediria permissão para executar uma tarefa em segundo plano (que presumo que me dará a resposta para o meu principal problema de por que está travando)?

Não tenho certeza se isso importa, mas este é um aplicativo universal do Windows (o app.xaml.cs acima está no Shared projeto.

A tarefa é assim:

BackgroundTaskDeferral _deferral = taskInstance.GetDeferral();

bool newConnected = IsConnected();
if (connected != newConnected)
{
    connected = newConnected;
    var notifier = ToastNotificationManager.CreateToastNotifier();
    var template = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastText02);

    var element = template.GetElementsByTagName("text")[0];
    element.AppendChild(template.CreateTextNode(connected ? "Connection available" : "Connection lost"));

    var toast = new ToastNotification(template);
    notifier.Show(toast);  
}

_deferral.Complete();
Foi útil?

Solução

Você perguntou: por que não me pediu permissão para executar uma tarefa em segundo plano?

A resposta é: a menos que sua tarefa em segundo plano exija acesso à tela de bloqueio, ela não requer permissão do usuário para ser registrada.Não há prompt do usuário, por design.Uma das intenções deste design é permitir registrar uma tarefa de outra tarefa.

No Windows, você não precisa ligar BackgroundExecutionManager.RequestAccessAsync() exceto para acesso à tela de bloqueio.Chamá-lo lhe dará mais cota, mas exigirá que o usuário aprove a tarefa.

No Windows Phone, ligar RequestAccessAsync() é obrigatório, não importa o que aconteça, mas nunca solicita ao usuário uma interface do usuário.Por esse motivo, a lógica do seu aplicativo universal pode ser compartilhada, mas provavelmente terá um #if tratar o registo de forma diferente, se for caso disso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top