2017-06-15 1 views
0

15分ごとに実行されるタイマーで、バックグラウンドタスクを使用してデータをアップロードする以下のコードがあります。 0メートルは:0:私のログをアップロードするために何もないとき はUWPバックグラウンドタスクキャンセル

WINDOWS SYNC SUCCESS示し、実際にあった場合に813ms

は、しかし、これをアップロードするデータは少し時間がかかり、私は2つのログで終わるを

WINDOWS SYNC取り消さAFTER:0メートル:25秒:108ms - WINDOWS SYNC SUCCESSをExecutionTimeExceeded:0メートル:27S: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でキャンセル通知を受け取った後、ジョブを終了してdeferal.Completeメソッドを呼び出すために5秒間がかかります。 Runメソッドで実行中のコードのキャンセルを拒否した場合、タスクは5秒後に終了します。

キャンセル通知が届きますが、実行方法のコードが実行され続けて、finallyに5秒未満で到達し、タスクは終了せずに正常に完了します。

トークンソースをキャンセルしても、必ずrunメソッドのコードがキャンセルされるわけではありません。あなたのコードは、トークンの取り消しが即座の効果を持たないところにあるかもしれません。

+0

これは私がこれまでテストしたすべてのもの – RCairns