CancellationToken不会在Azure Functions中触发

时间:2017-08-18 00:45:13

标签: azure azure-webjobs azure-functions

我有这个简单的Azure功能:

public static class MyCounter
{
    public static int _timerRound = 0;
    public static bool _isFirst = true;

    [FunctionName("Counter")]
    //[TimeoutAttribute("00:00:05")]
    public async static Task Run([TimerTrigger("*/10 * * * * *")]TimerInfo myTimer, TraceWriter log, CancellationToken token)
    {
        try
        {
            log.Info($"C# Timer trigger function executed at: {DateTime.UtcNow}");
            if (_isFirst)
            {
                log.Info("Cancellation token registered");
                token.Register(async () =>
                {
                    log.Info("Cancellation token requested");
                    return;
                });
                _isFirst = false;
            }
            Interlocked.Increment(ref _timerRound);
            for (int i = 0; i < 10; i++)
            {
                log.Info($"Round: {_timerRound}, Step: {i}, cancel request:{token.IsCancellationRequested}");
                await Task.Delay(500, token).ConfigureAwait(false);
            }
        }
        catch (Exception ex)
        {
            log.Error("hold on, exception!", ex);
        }
    }
}

我尝试做的是在应用停止或代码重新部署时捕获CancellationToken请求事件(主机关闭事件)。

顺便说一句,我也尝试检查for循环中的IsCancellationRequested属性。永远不会变成现实。

主要要求是在功能部署期间不要丢失任何操作/数据,我想知道应用程序正在停止,以便在更新后主机再次启动时我会保留一些数据进行处理。

1 个答案:

答案 0 :(得分:3)

根据您的代码,我测试了它,这是我的测试结果:

enter image description here

enter image description here

从上面的截图中我们可以发现,除了第一轮之外,后续轮次无法处理取消回调。正如Fabio Cavalcante评论的那样,我删除了_isFirst逻辑检查,发现它可以适用于所有轮次,如下所示:

enter image description here

注意:我通过在触发TimerTrigger时禁用我的功能来模拟主机的关闭。