0

WebJobs SDK支持向函数传递CancellationToken参数,SDK 使用该函数通知正在运行的函数主机关闭。我注意到,如果应用程序/功能被新版本替换,则不会通知正在运行的功能。如果函数被设计为运行更长的时间,这是一个问题,因为您最终可能会在不知情的情况下运行“旧”逻辑。

例如,如果您创建一个将永远运行(或直到取消)的简单函数:

using System;
using System.Threading;

public static async Task Run(string input, TraceWriter log, CancellationToken token)
{
    while (!token.IsCancellationRequested) 
    {    
        token.ThrowIfCancellationRequested();
        log.Info($"Input: {input}");
        await Task.Delay(2000, token).ConfigureAwait(false);
    }
}

如果您运行它,然后以某种方式更新代码并重新部署(或保存,如果您在 Azure Functions 门户中),您将看到该函数已重新编译,但正在运行的函数实例并未停止并将继续执行以前版本的代码,直到您手动禁用它。

是否有某种方法可以检测正在运行的函数中的重新部署?

4

1 回答 1

1

CancellationToken当 Function App 主机关闭/重新启动时,Azure Functions 会支持 WebJobs SDK模型。但是,在上述场景中,您只是简单地更新功能代码本身,这不会触发主机重启,这就是令牌没有被取消的原因。作为一种优化,我们只在绝对必要时重新启动主机,在简单的代码更新的情况下,我们可以保持主机运行,并在任何新调用时使用新代码。

这适用于函数调用不会“永远”存在的正常函数场景。我想说一个while(true)函数是一种反模式——函数不是为这种类型的东西设计的,你可能会以更好的方式完成你的场景。在相关说明中,还将为 GA 之前的函数执行设置一些时间限制(可配置)。

于 2016-06-25T14:30:00.050 回答