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();
}
これは私がこれまでテストしたすべてのもの – RCairns