2017-03-09 143 views
4

我下面https://docs.microsoft.com/en-us/windows/uwp/launch-resume/create-and-register-a-background-task文件創建,將每15分鐘運行Ping一個服務後臺任務5次後沒有運行。UWP後臺任務

  1. 創建與實施IBackgroundTask

    公共密封類在Windows運行時組件項目
    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. 項在UWP應用程序的文件Package.appmanifest

    <Extension Category="windows.backgroundTasks" EntryPoint="PeriodicBackgroundTask.FifteenMinutePeriodicTimer"> 
        <BackgroundTasks> 
        <Task Type="systemEvent" /> 
        <Task Type="timer" /> 
        </BackgroundTasks> 
    </Extension> 
    
  3. 登記定時器之初在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次運行後死亡。任何人都可以告訴我如何調試這個問題?

更多信息:

的Windows版本號:1607
Microsoft.NETCore.UniversalWindowsPlatform:5.1.0

回答

3

誰能告訴我我該怎麼調試這個問題?

註冊後臺任務後,您會在生命週期事件工具欄的下拉列表中找到後臺任務顯示。坐落在後臺任務一個破發點,然後點擊工具欄的背景名稱的Visual Studio將觸發後臺任務,你可以調試。更多詳情請參考Debug a background task

enter image description here

爲什麼FifteenMinuteBackgroundTimer是5次運行後死亡。

如果你在你的後臺任務運行任何異步代碼,那麼你的後臺任務需要使用deferral.It好像你創建的延期情況,但沒有得到來自IBackgroundTaskInstance推遲。所以你可能需要首先得到延期。

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

而且你可能不需要Task.Delay(TimeSpan.FromSeconds(15)).Wait();添加一些緩衝區異步進程完成,因爲延期可以幫你做到這一點。後臺任務只能運行30s,實際運行時間可能只有25s,如果在後臺任務中設置延遲可能會導致無法完成任務並強制關閉。

+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. 週期定時器的觸發器被認爲機會。根據背景中使用多少能量(在未通電和關閉屏幕的情況下),您的任務可能不會被解僱以節省其他關鍵用戶活動(如接收短信,按下或來電)的能量。 要驗證這是否是您遇到的情況:您可以在「設置 - >系統 - >電池 - >按應用程序」面板切換應用程序爲「始終允許」。
  2. 您還提到,如果屏幕關閉,觸發器運行時聯網功能將不起作用。在待機系統中,您需要指定IsNetworkRequested作爲觸發器註冊的一部分,以便系統在您的任務期間將網絡接口轉換爲完整的操作模式。 請參閱這裏的文檔:https://docs.microsoft.com/en-us/uwp/api/Windows.ApplicationModel.Background.BackgroundTaskBuilder