2016-08-24 1 views
5

전화 용으로 설계된 UWP 앱에서 작업하고 있습니다. 로컬 홈 네트워크에서 실행중인 서버와 데이터를 동기화하도록 설계되었습니다. 이 동기화는 꽤 오랜 시간이 걸릴 수 있으므로 백그라운드 작업이 데이터를 동기화하는 최상의 장소가 아닙니다. 아마도 내가 배정 된 30 초 이상 걸릴 것입니다. 그러나 타이머 트리거와 함께 백그라운드 작업을 사용하는 것이 좋습니다. 그것은 서버를 호출하여 소비 할 업데이트가 있는지 확인한 다음 포어 그라운드에서 동기화를 수행 할 수 있는지 묻는 축배 알림을 팝업합니다.UWP 백그라운드 작업 장치 화면이 꺼져있을 때 HttpClient가 실패합니다.

코드가 작동합니다. 화면이 켜져 있으면 작동합니다. 그러나 화면이 꺼지면 알림이 표시되지 않습니다. 처음에는 timertrigger가 작동하지 않는다고 생각 했었지만 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이 코드를 사용하여 가져 오기 :

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이다() 반환 "true"로, 저를 말하고 사용할 수있는 네트워크가있다. 하지만 여전히 전화를 걸면 "서버와의 연결을 설정할 수 없습니다"라는 메시지가 나타납니다. 내가 여기서 뭘 잘못하고 있는지 전혀 모르겠다.

아이디어가 있으십니까?

+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를 사용해보십시오. 한숨. 시대의 끝. –

답변

관련 문제