我有如下代码,它使用计时器上的后台任务上传数据,每15分钟运行一次。当没有任何东西可以上传我的日志显示
WINDOWS同步成功:0m:s:813 0s
然而,当有实际的数据要上传时,这需要更长的时间,我最终得到了2条日志。
取消窗口同步后:0m:25s:108 27s ExecutionTimeExceeded 窗口同步成功:0m:27s:617 27s
我知道我在后台任务上只有25秒-但是我的问题是为什么在触发OnCancelled事件时执行我的“最后”块?
这种情况并不总是发生,这正是让我感到困惑的原因。我经常只收到被取消的日志。终块总是会被调用吗?
另外--顺便说一句--当我测试时,当触发后台任务时,我让设备处于睡眠模式--不确定这是否相关。
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();
}发布于 2017-06-15 13:12:06
根据MSDN,背景任务限制在30秒以内。
背景任务的使用时间限制在30秒左右.
您的后台任务在25时收到取消通知,然后它有5秒的时间来完成它的工作并调用deferal.Complete方法。如果拒绝取消在Run方法中运行的代码,则任务将在5秒后终止。
因此,我认为在您的示例中,您收到了取消通知,但是run方法中的代码在不到5秒的时间内继续运行并到达finally,您的任务成功地完成而没有被终止。
请注意,取消令牌源并不一定立即取消run方法中的代码。您的代码可能处于取消令牌没有立即生效的位置。
https://stackoverflow.com/questions/44566488
复制相似问题