2016-08-24 80 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。嘆。一個時代的終結。 –

回答