UWP HttpClient da tarefa em segundo plano falha quando a tela do dispositivo está desativada

Estou trabalhando em um aplicativo UWP projetado para telefones. Ele foi projetado para sincronizar dados com um servidor em execução na sua rede doméstica local. Essa sincronização pode demorar um pouco, portanto, uma tarefa em segundo plano não é o melhor lugar para sincronizar os dados; provavelmente levará mais do que os 30 segundos que me são atribuídos. A idéia, no entanto, é usar uma tarefa em segundo plano com um gatilho de timer; ele ligará para o servidor para verificar se há alguma atualização a ser consumida e, em seguida, exibirá uma notificação do sistema perguntando se ele pode ser executado em primeiro plano para executar a sincronização.

O código funciona muito bem ... se a tela estiver ligada. Mas se a tela estiver desligada, nunca receberei notificações. No começo, pensei que o disparador do timer não estava sendo acionado, mas fazia logon sempre que era executado e, com certeza, era executado a cada 15 minutos no horário. Eu olhei mais profundamente, e está falhando. Especificamente, está falhando na chamada de rede; HttpClient.GetAsync, com o seguinte erro:

"The text associated with this error code could not be found.\r\n\r\nA connection with the server could not be established\r\n"

Agora eu verifiquei o servidor; está correndo. Ligo a tela e o código repentinamente funciona novamente. Configurei o gatilho para executar apenas quando uma conexão não medida está disponível:

    var status = await BackgroundExecutionManager.RequestAccessAsync();
    if(status.In(BackgroundAccessStatus.DeniedBySystemPolicy, BackgroundAccessStatus.DeniedByUser))
    {
        return;
    }

    var builder = new BackgroundTaskBuilder();
    builder.Name = Constants.BackgroundTaskName;
    builder.SetTrigger(new TimeTrigger(15, false));
    builder.AddCondition(new SystemCondition(SystemConditionType.FreeNetworkAvailable));
    BackgroundTaskRegistration task = builder.Register();

Então eu fariapensar que o timer só é acionado quando o Wifi está disponível. Mas quando eu realmente executar o HTTP Get usando este código:

    async protected override void OnBackgroundActivated(BackgroundActivatedEventArgs args)
    {
        if (BackgroundWorkCost.CurrentBackgroundWorkCost == BackgroundWorkCostValue.High)
            return;
        if (!NetworkInterface.GetIsNetworkAvailable())
            return;
        base.OnBackgroundActivated(args);
        if (args.TaskInstance.Task.Name == Constants.BackgroundTaskName)
        {
            var cancel = new CancellationTokenSource();
            args.TaskInstance.Canceled += (s, e) =>
            {
                cancel.Cancel();
                cancel.Dispose();
            };
            var deferral = args.TaskInstance.GetDeferral();
            try
            {
                HttpClient client = GetClient();
                var response = await client.GetAsync(ConstructUrl(client.BaseAddress, "updates"), cancel.Token);
                var info = await ParseHttpResponse<UpdateInformation>(response);     
            }
            catch { }
            finally
            {
                deferral.Complete();
            }
        }

Agora, o engraçado é que NetworkInterface.GetIsNetworkAvailable () retorna "true", dizendo que há uma rede disponível. Ainda assim, quando faço a chamada, recebo "Não foi possível estabelecer uma conexão com o servidor". Não tenho ideia do que estou fazendo de errado aqui.

Alguma ideia?

questionAnswers(2)

yourAnswerToTheQuestion