La tarea en segundo plano UWP HttpClient falla cuando la pantalla del dispositivo está apagada

Estoy trabajando en una aplicación para UWP diseñada para teléfonos. Está diseñado para sincronizar datos con un servidor que se ejecuta en su red doméstica local. Esta sincronización puede llevar bastante tiempo, por lo que una tarea en segundo plano no es el mejor lugar para sincronizar los datos; probablemente tomará más de los 30 segundos que me asignan. La idea, sin embargo, es utilizar una tarea en segundo plano con un disparador de temporizador; llamará al servidor para verificar si hay actualizaciones para consumir y luego aparecerá una notificación de tostada preguntando si puede ejecutarse en primer plano para realizar la sincronización.

El código funciona muy bien ... si la pantalla está encendida. Pero si la pantalla está apagada, nunca recibo ninguna notificación. Al principio pensé que el disparador de tiempo no se activaba, pero inicié sesión cada vez que funcionaba y, efectivamente, corría cada 15 minutos a tiempo. Lo miré más profundamente y está fallando. Específicamente, está fallando en la llamada de red; HttpClient.GetAsync, con el siguiente error:

"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"

Ahora revisé el servidor; está corriendo. Enciendo la pantalla y el código vuelve a funcionar de repente. He configurado el disparador para que solo se ejecute cuando hay una conexión no medida disponible:

    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();

Entonces yopensar que el temporizador solo se activa cuando el Wifi está disponible. Pero luego, cuando realmente realizo el 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();
            }
        }

Ahora lo curioso es que NetworkInterface.GetIsNetworkAvailable () devuelve "true" y me dice que hay una red disponible. Pero aún así, cuando hago la llamada, aparece "No se pudo establecer una conexión con el servidor". No tengo idea de lo que estoy haciendo mal aquí.

¿Algunas ideas?

Respuestas a la pregunta(2)

Su respuesta a la pregunta