C# 中的 TimerTrigger 未触发

Posted

技术标签:

【中文标题】C# 中的 TimerTrigger 未触发【英文标题】:TimerTrigger in C# is not triggering 【发布时间】:2021-12-26 03:36:14 【问题描述】:

我正在使用 TimerTrigger CRON 作业将任务安排为 2 天,但触发器似乎不起作用。 以下是我尝试过的代码,

public static void StartupJob([TimerTrigger("0 * * * * *", RunOnStartup = true)] TimerInfo timerInfo) //0 * * * * * added CRON job to run for every minute for testing purpose
        
            Console.WriteLine("Timer job fired!");
        

local.settings.json


    "IsEncrypted": false,
    "Values": 
      "AzureWebJobsStorage": "UseDevelopmentStorage=true",
      "FUNCTIONS_WORKER_RUNTIME": "dotnet"
    

由于上面的代码不起作用,我在 main() 中添加了以下内容

static void Main()
        
            var config = new JobHostConfiguration();
            config.UseTimers();
            config.Tracing.ConsoleLevel = System.Diagnostics.TraceLevel.Verbose;

            if (config.IsDevelopment)
            
                config.UseDevelopmentSettings();
            

            var host = new JobHost(config);
            // The following code ensures that the WebJob will be running continuously
            host.RunAndBlock();
        

收到以下错误并显示安装 DocumentFormat 包的修复程序,但安装此包无法解决 FunctionName 错误。

我是 C# 的新手,无法在这里找到问题所在。任何帮助或对好的示例的参考都会有所帮助和赞赏。

谢谢。

【问题讨论】:

我想也许你在 CRON 表达式中的一颗星太多了。我不熟悉 CRON,但那里的一位表达式测试器暗示了这一点。 进一步研究,看起来你应该每分钟都有“* * * * *”。 @BentTranberg 不,这不起作用它没有触发 根据您发布的代码,您似乎缺少FunctionName 属性。所以附上它就像[FunctionName("StartupJob")] @user1672994 是否需要添加任何包才能使用 FunctionName? 【参考方案1】:

我试图重现您的问题并想通了。

    首先,我在 Visual Studio 中创建了 Azure Function 并选择了 Timer Trigger > 点击创建

    根据您每分钟运行此计时器触发功能的要求,我将表达式更改为[TimerTrigger("0 * * * * *")]

    之后,构建项目并在本地运行函数。 输出是:

    在 Azure 中创建了 Function App(消费计划)。 将上述函数应用从 Visual Studio 发布到 Azure 函数应用。 然后,转到 Azure 门户 > 您的函数应用程序 > 函数(在左侧索引窗格中) > 单击您的函数名称(在我的例子中是 Function1)

之后,转到代码+集成,点击测试/运行你的函数,日志将开始记录函数的执行,如下所示:

示例 2(使用问题中的给定代码):

问题在于Console.Writeline 是一个静态函数您可以将其输出 (stdout) 重定向到其他位置,但您无法跟踪该语句在到达标准输出后从何处运行。

为了让我们对每个函数调用进行日志记录,我们需要知道它来自哪个函数以及它属于哪个特定的调用 id。这就是TraceWriter 所做的。从那里,我们的日志引擎将其输出到 Storage 以供我们的仪表板获取。我们确实将 stdout 管道通过管道传输到 WebJob 日志,但将其绑定回给定的调用并不简单。

欲了解更多信息,请关注:https://github.com/Azure/azure-webjobs-sdk/issues/682

可以使用的另一种方法是自定义日志记录框架(例如 Serilog)并将日志输出直接输出到控制台。

有关记录样本的更多信息,您可以点击以下链接:

https://docs.microsoft.com/en-us/sandbox/functions-recipes/logging?tabs=csharp

【讨论】:

如果回答对您有帮助,请Accept it as an Answer,以便其他遇到相同问题的人可以找到此解决方案并解决他们的问题!

以上是关于C# 中的 TimerTrigger 未触发的主要内容,如果未能解决你的问题,请参考以下文章

Azure Function App:Http 触发器与计时器触发器

使用 c# 在数据列表中的按钮单击事件上未触发 Itemcommand

模态弹出窗口未在 C# 中触发

C#:是不是可以获得异常触发器? [复制]

为啥我的验证事件没有在 C# 中触发?

Azure 触发的 Webjob - 检测 webjob 何时停止