首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UWP背景任务取消

UWP背景任务取消
EN

Stack Overflow用户
提问于 2017-06-15 11:35:50
回答 1查看 1K关注 0票数 1

我有如下代码,它使用计时器上的后台任务上传数据,每15分钟运行一次。当没有任何东西可以上传我的日志显示

WINDOWS同步成功:0m:s:813 0s

然而,当有实际的数据要上传时,这需要更长的时间,我最终得到了2条日志。

取消窗口同步后:0m:25s:108 27s ExecutionTimeExceeded 窗口同步成功:0m:27s:617 27s

我知道我在后台任务上只有25秒-但是我的问题是为什么在触发OnCancelled事件时执行我的“最后”块?

这种情况并不总是发生,这正是让我感到困惑的原因。我经常只收到被取消的日志。终块总是会被调用吗?

另外--顺便说一句--当我测试时,当触发后台任务时,我让设备处于睡眠模式--不确定这是否相关。

代码语言:javascript
复制
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();
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-15 13:12:06

根据MSDN,背景任务限制在30秒以内。

背景任务的使用时间限制在30秒左右.

您的后台任务在25时收到取消通知,然后它有5秒的时间来完成它的工作并调用deferal.Complete方法。如果拒绝取消在Run方法中运行的代码,则任务将在5秒后终止。

因此,我认为在您的示例中,您收到了取消通知,但是run方法中的代码在不到5秒的时间内继续运行并到达finally,您的任务成功地完成而没有被终止。

请注意,取消令牌源并不一定立即取消run方法中的代码。您的代码可能处于取消令牌没有立即生效的位置。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44566488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档