首页 > 解决方案 > 定时器功能块 HttpTrigger Azure 功能 ap

问题描述

我有 1 个函数应用程序项目,带有一个 Timer 触发器和一个 http 触发器。(使用与否,似乎无关紧要)

定时器触发器:

public static class Timer
{
    [FunctionName("Timer")]
    public static void Run([TimerTrigger("0 */5 * * * *", RunOnStartup =true)]TimerInfo myTimer, ILogger log)
    {
        log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");

        Thread.Sleep(10000);//this is just for demonstrating the behavior!!

        log.LogInformation($"C# Timer trigger function executed done");
    }
}

http触发器:

public static class Function1
{
    [FunctionName("test2")]
    public static async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)] HttpRequest req,
        ILogger log)
    {

        return new OkObjectResult("Done");
    }
}

问题是,当计时器运行时,所有请求都被阻止。导致“错误:连接 ECONNREFUSED 127.0.0.1:7071”

我在这里和那里(主要是在评论中)读到不支持多个触发器,但这对我来说没有意义,因为无论如何一切似乎都准备好了(我的意思是:我找不到任何关于它的结论性文档, VS不会对添加多个产生任何阻力,甚至调试界面和天蓝色界面也很好地总结了它可以找到的所有功能......)

这是预期的行为,还是我可以更改一些设置以使其并行运行?

标签: c#azureazure-functions

解决方案


这种行为是意料之中的,因为您通过运行Thread.Sleep(). 只要您的 Function App 没有扩展到多个实例,就只有一个进程在运行您的 Functions。这就是异步工作的用武之地。

如果您将计时器触发功能更改为此,它应该可以正常工作。

[FunctionName("Timer")]
    public static async Task Run([TimerTrigger("0 */5 * * * *", RunOnStartup=true)] TimerInfo myTimer, ILogger log)
    {
        log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");

        await Task.Delay(10000);

        log.LogInformation($"C# Timer trigger function executed done");
    }

在此旁边,请注意:

  • 不建议将计时器触发功能设置RunOnStartuptrue
  • 不建议在函数中显式构建延迟
  • 不支持一个函数的多个触发器,支持在一个函数应用中拥有多个函数,每个函数都有自己的触发器。
  • 函数应用程序是一个或多个函数的集合

触发器是导致函数运行的原因。触发器定义了如何调用函数,并且函数必须只有一个触发器。触发器具有关联的数据,这些数据通常作为函数的有效负载提供。

来源:Azure Functions 触发器和绑定概念

编辑:
对其进行了测试,当 Function 为 时也会发生这种情况async,并且在 Azure 上运行时也会发生这种情况。这意味着函数的初始运行runAtStartup=true 始终会阻止任何其他传入请求,并且runOnStartup启用触发器时,只要扩展函数应用程序就会调用该触发器。


推荐阅读