2017-03-09 2 views
4

15 분마다 실행되고 서비스에 ping을 수행하는 백그라운드 작업을 생성하려면 https://docs.microsoft.com/en-us/windows/uwp/launch-resume/create-and-register-a-background-task 문서를 따르고 있습니다.UWP 백그라운드 작업이 5 회 실행되지 않음

  1. 만든 UWP 응용 프로그램의 Package.appmanifest에서

    namespace PeriodicBackgroundTask 
    { 
        public sealed class FifteenMinutePeriodicTimer : IBackgroundTask 
        { 
         private static readonly FileLogWriter mWriteLogToFile = new FileLogWriter(); 
         public FifteenMinutePeriodicTimer() { } 
    
         public void Run(IBackgroundTaskInstance taskInstance) 
         { 
          try 
          { 
           taskInstance.Canceled += new BackgroundTaskCanceledEventHandler(OnCanceled); 
           mDeferral = taskInstance.GetDeferral(); 
           mWriteLogToFile.log("Starting periodic timer at " + DateTime.Now.ToString()); 
    
           // Calling method to do a Post call to a service. 
    
           mWriteLogToFile.log("Finishing periodic timer at " + DateTime.Now.ToString()); 
          } 
          catch (Exception ex) 
          { 
           mWriteLogToFile.log("Fifteen Minute periodic timer failed.", ex); 
          } 
          finally 
          { 
           // Adding some buffer for async processes to finish.  
           Task.Delay(TimeSpan.FromSeconds(15)).Wait(); 
           mDeferral.Complete(); 
          } 
         } 
    
         private void OnCanceled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason) 
         { 
          mWriteLogToFile.log("Fifteen minute periodic timer is canceled. {0}", reason.ToString()); 
         } 
        } 
    } 
    
  2. 항목이의 시작 부분에

    <Extension Category="windows.backgroundTasks" EntryPoint="PeriodicBackgroundTask.FifteenMinutePeriodicTimer"> 
        <BackgroundTasks> 
        <Task Type="systemEvent" /> 
        <Task Type="timer" /> 
        </BackgroundTasks> 
    </Extension> 
    
  3. 등록 타이머를 제출 IBackgroundTask

    를 구현하는 공공 봉인 클래스와 Windows 런타임 구성 요소 프로젝트 App.xaml.cs의 OnLaunched 메서드

    public async static Task RegisterBackgroundTask() 
    { 
        foreach (var task in BackgroundTaskRegistration.AllTasks) 
        { 
         if (String.Equals(task.Value.Name, TASK_NAME)) 
         { 
          mWriteLogToFile.log("Old version of fifteen minute periodic timer found. Unregistering it."); 
          BackgroundExecutionManager.RemoveAccess(); 
          // Unregistering so that any update in Background task can be applied. 
          task.Value.Unregister(true); 
          break; 
         } 
        } 
        BackgroundAccessStatus backgroundAccessStatus = await BackgroundExecutionManager.RequestAccessAsync(); 
        if (backgroundAccessStatus == BackgroundAccessStatus.DeniedByUser || 
        backgroundAccessStatus == BackgroundAccessStatus.DeniedBySystemPolicy) 
        { 
         mWriteLogToFile.log("Fifteen minute periodic timer registration failed, due to Request access status."); 
         return; 
        } 
    
        BackgroundTaskBuilder builder = new BackgroundTaskBuilder(); 
        builder.Name = TASK_NAME; 
        builder.TaskEntryPoint = "PeriodicBackgroundTask.FifteenMinutePeriodicTimer"; 
        builder.SetTrigger(new TimeTrigger(15, false)); 
        builder.CancelOnConditionLoss = false; 
    
        var backgroundTask = builder.Register(); 
        if (backgroundTask != null) 
        { 
         mWriteLogToFile.log("Fifteen minute periodic timer registration SUCCESSFUL."); 
        } 
        else 
        { 
         mWriteLogToFile.log("Fifteen minute periodic timer registration FAILED."); 
        } 
    } 
    

앱 설치 후 FifteenMinuteBackgroundTimer가 5 회 또는 6 회 실행됩니다. 때로는 5, 때로는 6. Visual Studio를 사용하여 작업을 디버깅하려고 할 때 디버깅 할 수 있습니다. 나는 확실하지 않다, 왜 FifteenMinuteBackgroundTimer는 5의 실행 후에 죽어 가고있다. 아무도 내가 어떻게이 문제를 디버깅 할 수 말해 줄래?

추가 정보 :

윈도우 빌드 : 1607
Microsoft.NETCore.UniversalWindowsPlatform : 5.1.0

답변

3

나는이 문제를 디버깅하는 방법을 사람이 말해 주시겠습니까?

백그라운드 작업을 등록하면 라이프 사이클 이벤트 드롭 다운 목록에 백그라운드 작업 표시가 나타납니다. 백그라운드 작업에 중단 점을 설정하고 툴바에서 배경 이름을 클릭하면 Visual Studio가 백그라운드 작업을 트리거하고 디버깅 할 수 있습니다. 자세한 내용은 Debug a background task을 참조하십시오.

enter image description here

는 FifteenMinuteBackgroundTimer 5 실행 후 죽어가는 이유. 당신이 연기 인스턴스를 생성하지만 IBackgroundTaskInstance에서 연기를하지 않았다처럼

당신이 당신의 백그라운드 작업에 비동기 코드를 실행하면, 다음 백그라운드 작업이 deferral.It를 사용할 필요가 보인다. 따라서 우선 연기를해야 할 수도 있습니다.

public void Run(IBackgroundTaskInstance taskInstance) 
{ 
    mDeferral = taskInstance.GetDeferral(); 
    ... 
    mDeferral.Complete();  
} 

그리고 당신은 연기가 이렇게 도움이 될 수 있기 때문에 비동기 프로세스가 완료 될 때까지 몇 가지 버퍼를 추가하기위한 Task.Delay(TimeSpan.FromSeconds(15)).Wait();을 필요로하지 않을 수 있습니다. 백그라운드 작업은 총 30 초까지만 실행할 수 있습니다. 실제로 실행 시간은 25 초가 될 수 있습니다. 백그라운드 작업에서 지연을 설정하면 작업을 완료 할 수없고 강제 종료 될 수 있습니다.

+0

응답 해 주셔서 감사합니다. 나는 너의 제안을 시도하고 진전을 보였다. 화면이 항상 켜져있는 상태에서 기기를 충전 상태로두면주기 타이머가 실행 중입니다. 그러나 화면을 잠그고 플러그를 뽑으면주기 타이머가 실행되지 않습니다. – c2tarun

+1

@ c2tarun - 설정, 시스템, 배터리, 응용 프로그램 별 배터리로 이동하여 응용 프로그램을 '항상 실행'으로 변경할 수 있습니다. 이상적은 아니지만 그것이 문제인지 알릴 수 있습니다. –

+0

답장을 보내 주셔서 감사합니다.이 앱에서 내 앱에 LockScreen 앱을 만들었습니다. https://msdn.microsoft.com/en-us/library/windows/apps/hh700416.aspx?f=255&MSPPError=-2147217396 해결 된 것 같습니다. 화면을 잠글 때 백그라운드 작업이 실행되지 않는 문제. 하지만 이상한 일은 작업이 실행 중일 때 네트워크 호출을하지 못하는 것입니다. 나는 그것이 http://stackoverflow.com/questions/39133667/uwp-background-task-httpclient-fails-when-device-screen-is-off와 관련된 것이라고 생각한다. – c2tarun

1

전원 관련 두 가지 정책을 실행하고있을 가능성이 큽니다.

  1. 주기적인 타이머 트리거는 기회 주의적 것으로 간주됩니다. 백그라운드에서 사용되는 에너지의 양 (전원이 공급되지 않고 화면이 꺼지는 동안)에 따라 다른 중요한 사용자 활동 (예 : SMS 수신, 푸시 또는 수신 전화 통화)을 위해 에너지를 절약하기 위해 작업을 시작하지 못할 수도 있습니다. 이것이 실행중인 상태인지 확인하려면 "설정 -> 시스템 -> 배터리 -> 배터리 - 응용 프로그램 별"패널에서 응용 프로그램을 "항상 허용"으로 토글 할 수 있습니다.
  2. 또한 화면이 꺼져 있으면 트리거가 실행될 때 네트워킹이 작동하지 않는다고 언급했습니다. 대기 시스템에서 트리거 등록의 일부로 IsNetworkRequested를 지정하여 시스템이 작업 기간 동안 네트워크 인터페이스를 전체 작동 모드로 설정해야합니다. 여기에서 설명서를 참조하십시오. https://docs.microsoft.com/en-us/uwp/api/Windows.ApplicationModel.Background.BackgroundTaskBuilder
관련 문제