2016-08-24 82 views
5

我正在开发专为手机设计的UWP应用程序。它旨在将数据与本地家庭网络上运行的服务器进行同步。此同步可能需要一段时间,因此后台任务不是同步数据的最佳位置;它可能需要超过我分配的30秒。然而,这个想法是使用带有定时器触发器的后台任务;它会调用服务器来检查是否有更新消耗,然后弹出一个Toast通知,询问它是否可以在前台运行以执行同步。UWP后台任务HttpClient在设备屏幕关闭时失败

该代码很好...如果屏幕开启。但是,如果屏幕关闭,那么我从来没有收到任何通知。起初,我认为时间触发器没有触发,但是我每次运行都记录下来,并且足够肯定,每15分钟就按时运行一次。我深入了解它,并且失败了。具体来说,它在网络通话中失败; HttpClient.GetAsync,出现以下错误:

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

现在我检查了服务器;它正在运行。我打开屏幕,代码突然再次运行。我已经设置了扳机,仅运行时将未计量的连接可用:

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

所以,我认为时提供无线网络连接定时器仅被触发。但后来当我真正执行HTTP GET使用此代码:

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

现在,有趣的是,NetworkInterface.GetIsNetworkAvailable()返回“真”,告诉我有可用的网络。但是,当我拨打电话时,我会收到“与服务器的连接无法建立”。我不知道我在这里做错了什么。

任何想法?

+0

我觉得你的情况下正确的方法是使用[ControlChannelTrigger(https://msdn.microsoft.com/library/windows/apps/hh701032),有你试过吗?还有一个[示例](https://code.msdn.microsoft.com/windowsapps/ControlChannelTrigger-HTTP-9d7a6b3d)。 –

+0

@ Ron Penton:我也遇到了这个问题。你有没有找到解决这个问题的办法? – c2tarun

+0

不,我永远不会。我认为它是内置于系统中的。我尝试了许多不同的手机。实际上,我上周放弃了。最后试用Android。叹。一个时代的终结。 –

回答