2017-06-15 131 views
0

我有像下面這樣的代碼,使用每15分鐘運行的定時器上的後臺任務上傳數據。 當沒有什麼可以上傳我的日誌顯示UWP後臺任務取消

Windows同步成功:0米:0:813ms

然而,當真正有數據上傳這需要一點時間和我結束了2個數量級

Windows同步取消後:0米:25S:108ms - ExecutionTimeExceeded Windows同步成功:0米:-27:617ms

我明白我只有25秒的後臺任務 - 但是我的問題是爲什麼當觸發OnCancelled事件時,我的「finally」塊被執行?

這並不總是會發生,這讓我感到困惑。通常我只是得到取消的日誌。 finally塊總是會被調用嗎?

此外 - 作爲旁白 - 當我測試這個時,我的設備處於睡眠模式,當後臺任務被觸發 - 不知道這是否相關。

public sealed class BackgroundSync : IBackgroundTask 
{ 
    CancellationTokenSource cancelTokenSource = new CancellationTokenSource(); 

    private DateTime startTime; 
    private DateTime endTime; 

    public async void Run(IBackgroundTaskInstance taskInstance) 
    { 
     BackgroundTaskDeferral _deferral = taskInstance.GetDeferral(); 

     // Associate a cancellation handler with the background task. 
     taskInstance.Canceled += new BackgroundTaskCanceledEventHandler(OnCancelled); 

     try 
     { 
      await Task.Run(async() => 
      { 
       startTime = DateTime.Now; 
       // MY PROCESSSING IN HERE 
       endTime = DateTime.Now; 
      }); 

     } 
     catch (Exception e) 
     { 
      await DataNAVToMobile.InsertBackgroundLog("WINDOWS SYNC EXCEPTION: " + e.Message); 
     } 
     finally 
     {   
      TimeSpan timeSpan = endTime - startTime; 
      await DataNAVToMobile.InsertBackgroundLog("WINDOWS SYNC SUCCESS: " + String.Format("{0}m:{1}s:{2}ms",timeSpan.Minutes,timeSpan.Seconds,timeSpan.Milliseconds)); 
      _deferral.Complete(); 
     } 

    } 

    private void OnCancelled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason) 
    { 
     // The background task has been detected as idle or hung. 
     // Cancel all pending async operations and return from the task. 
     endTime = DateTime.Now; 
     TimeSpan timeSpan = endTime - startTime; 
     DataNAVToMobile.InsertBackgroundLog("WINDOWS SYNC CANCELLED AFTER: " + String.Format("{0}m:{1}s:{2}ms", timeSpan.Minutes, timeSpan.Seconds, timeSpan.Milliseconds) + " - " + reason.ToString()); 
     cancelTokenSource.Cancel(); 
    } 

回答

1

後臺任務是根據MSDN限定爲30秒:

背景任務都不限於掛鐘使用的30秒。

您的後臺任務收到取消通知25,然後它有5秒鐘完成其作業,並調用deferal.Complete方法。如果您拒絕取消在Run方法中運行的代碼,則您的任務將在5秒後終止。

因此,我認爲在您的情況下,您會收到取消通知,但run方法中的代碼會繼續運行並在少於5秒內達到finally,並且您的任務成功完成而不會終止。

請注意,取消令牌源不一定會立即取消run方法中的代碼。您的代碼可能處於取消令牌不會立即生效的地步。

+0

謝謝 - 這對我迄今爲止測試過的所有東西都很有意義 – RCairns