【问题标题】:UWP Background Task CancellationUWP后台任务取消
【发布时间】: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


    【解决方案1】:

    根据MSDN,后台任务限制为30秒:

    后台任务的使用时间限制为 30 秒。

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

    所以我认为在您的情况下,您会收到取消通知,但 run 方法中的代码会继续运行并在不到 5 秒的时间内到达finally,并且您的任务成功完成而不会被终止。

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

    【讨论】:

    • 谢谢-到目前为止我测试过的所有东西都完全有意义
    猜你喜欢
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多