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

.NET 8独立运行时Azure Function QueueTrigger未接收取消请求

.NET 8 Azure Functions Isolated Runtime: QueueTrigger CancellationToken Not Triggering on Shutdown

问题概述

  • 基于dotnet-isolated运行时的.NET 8 Azure Functions v4 QueueTrigger,生产环境中应用中途关闭会导致状态异常
  • 为函数方法添加CancellationToken参数,期望通过cancellationToken.IsCancellationRequested实现优雅关闭,但该值始终为false
  • 本地Visual Studio按CTRL+C、Azure中禁用函数模拟关闭场景,均未触发取消请求
  • 切换到进程内(in-process)运行时,CancellationToken可正常触发取消信号

问题原因

这是dotnet-isolated运行时的已知问题:当前运行时在处理应用关闭信号(如CTRL+C、Azure函数禁用)时,未正确将取消请求传递给QueueTrigger函数的CancellationToken参数,而进程内运行时不存在该问题。

临时解决方案

1. 使用主机级取消令牌

通过依赖注入获取IHostApplicationLifetime,使用其ApplicationStopping令牌替代函数参数的CancellationToken,该令牌可正确捕获应用关闭信号:

Program.cs 配置

var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults()
    .Build();

host.Run();

函数实现

public class QueueProcessingFunction
{
    private readonly IHostApplicationLifetime _hostLifetime;

    public QueueProcessingFunction(IHostApplicationLifetime hostLifetime)
    {
        _hostLifetime = hostLifetime;
    }

    [Function("QueueTrigger")]
    public async Task ProcessQueueItem(
        [QueueTrigger("your-queue-name")] string queueItem)
    {
        var cancellationToken = _hostLifetime.ApplicationStopping;

        try
        {
            // 执行队列处理逻辑,将cancellationToken传入异步方法
            await ProcessItemAsync(queueItem, cancellationToken);
        }
        catch (OperationCanceledException)
        {
            // 处理取消逻辑,清理资源
            CleanupInProgressState();
        }
    }

    private async Task ProcessItemAsync(string item, CancellationToken cancellationToken)
    {
        while (!cancellationToken.IsCancellationRequested)
        {
            // 模拟长时间运行的任务
            await Task.Delay(1000, cancellationToken);
        }
    }

    private void CleanupInProgressState()
    {
        // 实现状态清理逻辑
    }
}

2. 备选方案:检查进程退出状态

作为临时补充,可在逻辑中定期检查当前进程状态,作为取消信号的备选判断:

if (Process.GetCurrentProcess().HasExited)
{
    CleanupInProgressState();
    return;
}

该方式可靠性低于主机令牌,仅建议作为过渡方案。

后续处理

关注官方对该dotnet-isolated运行时问题的修复进度,待修复完成后,可切换回使用函数参数自带的CancellationToken。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 22:08:24