You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 8 隔离工作者模型下Azure定时触发函数配置求助

.NET 8 隔离工作者模型实现每日定时触发Azure Function

你的核心问题是误用了HTTP触发+Durable编排的组合,导致需要手动访问URL启动任务。要实现无需手动干预的每日定时任务,直接使用**Timer Trigger(定时触发器)**即可,以下分两种场景给出解决方案:


场景1:直接执行定时任务(无需Durable编排)

如果你的业务逻辑不需要复杂的流程编排、重试机制,直接用Timer Trigger实现最简洁:

代码实现

using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;

public class DailyScheduledTask
{
    private readonly ILogger<DailyScheduledTask> _logger;

    public DailyScheduledTask(ILogger<DailyScheduledTask> logger)
    {
        _logger = logger;
    }

    // CRON表达式:每天UTC时间23:30执行
    [Function(nameof(RunDailyJob))]
    public async Task RunDailyJob([TimerTrigger("0 30 23 * * *")] TimerInfo timerInfo, FunctionContext context)
    {
        _logger.LogInformation("每日定时任务启动:{CurrentTime}", DateTime.UtcNow);

        // 执行你的业务逻辑
        await ProcessCity("Tokyo");
        await ProcessCity("London");
        await ProcessCity("Seattle");

        _logger.LogInformation("每日定时任务执行完成");
    }

    private async Task ProcessCity(string cityName)
    {
        _logger.LogInformation("处理城市:{CityName}", cityName);
        // 替换为实际业务代码
        await Task.CompletedTask;
    }
}

时区配置(可选)

如果需要按本地时区(如北京时间)执行,在host.json中添加时区配置:

{
  "version": "2.0",
  "extensions": {
    "timer": {
      "schedule": {
        "timeZone": "Asia/Shanghai"
      }
    }
  }
}

此时CRON表达式可直接写本地时间,比如0 30 23 * * *就表示北京时间23:30执行。


场景2:定时启动Durable编排(需复杂流程)

如果你的业务需要Durable Functions的编排能力(如重试、分支、长时间运行),用Timer Trigger替代HTTP触发来启动编排即可:

修改后的代码

using Microsoft.Azure.Functions.Worker;
using Microsoft.DurableTask;
using Microsoft.DurableTask.Client;
using Microsoft.Extensions.Logging;

static class ProcessCustomers
{
    [Function(nameof(ProcessCustomerEmailAccounts))]
    public static async Task<string> ProcessCustomerEmailAccounts([OrchestrationTrigger] TaskOrchestrationContext context)
    {
        string result = "";
        result += await context.CallActivityAsync<string>(nameof(SayHello), "Tokyo") + " ";
        result += await context.CallActivityAsync<string>(nameof(SayHello), "London") + " ";
        result += await context.CallActivityAsync<string>(nameof(SayHello), "Seattle");
        return result;
    }

    [Function(nameof(SayHello))]
    public static async Task<string> SayHello([ActivityTrigger] string cityName, FunctionContext executionContext)
    {
        ILogger logger = executionContext.GetLogger(nameof(SayHello));
        logger.LogInformation("向{City}问好", cityName);
        return await Task.FromResult($"Hello, {cityName}!");
    }

    // 用Timer Trigger替代HTTP触发,每日启动编排
    [Function(nameof(StartDailyOrchestration))]
    public static async Task StartDailyOrchestration(
        [TimerTrigger("0 30 23 * * *")] TimerInfo timerInfo,
        [DurableClient] DurableTaskClient client,
        FunctionContext executionContext)
    {
        ILogger logger = executionContext.GetLogger(nameof(StartDailyOrchestration));

        string instanceId = await client.ScheduleNewOrchestrationInstanceAsync(nameof(ProcessCustomerEmailAccounts));
        logger.LogInformation("创建编排实例ID:{InstanceId}", instanceId);
    }
}

关键说明

  1. CRON表达式规则:分 时 日 月 周 年,例如0 30 23 * * *表示每天UTC23点30分执行。
  2. 隔离模型依赖:确保已安装NuGet包:
    • Microsoft.Azure.Functions.Worker
    • Microsoft.Azure.Functions.Worker.Extensions.Timer(Timer Trigger必需)
    • Microsoft.Azure.Functions.Worker.Extensions.DurableTask(Durable编排必需)
  3. 本地运行验证:启动函数后,会自动在指定时间触发任务,无需手动访问URL。

内容的提问来源于stack exchange,提问作者AlanK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 21:25:55