【发布时间】:2017-06-16 19:46:02
【问题描述】:
我有如下代码,它使用后台任务在每 15 分钟运行一次的计时器上上传数据。 当没有什么可以上传我的日志显示
WINDOWS 同步成功:0m:0s:813ms
但是,当实际有数据要上传时,这需要更长的时间,我最终会得到 2 个日志
WINDOWS SYNC 被取消后:0m:25s:108ms - ExecutionTimeExceeded WINDOWS 同步成功:0m:27s:617ms
我知道我只有 25 秒的时间来执行后台任务 - 但是我的问题是为什么在触发 OnCancelled 事件时执行我的“最终”块?
这并不总是发生,这让我感到困惑。通常我只是得到取消的日志。 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();
}
【问题讨论】:
标签: uwp