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

Azure Function异步HTTP请求如何传递CancellationToken?是否必要?

问题

我是Azure Functions新手,现有一段基于Activity Trigger的Durable函数代码,当队列中有项时触发执行。在调用执行HTTP API请求的_myService.GetCompaniesAsync()异步方法时,不清楚如何传递CancellationToken,同时想了解在此场景下是否有必要传递该令牌。

代码示例:

[FunctionName("ProcessCompanies")]
public async Task ProcessCompaniesAsync([ActivityTrigger] IDurableOrchestrationContext context,
    [Queue("outqueue"), StorageAccount("AzureWebJobsStorage")] ICollector<myCompanyData> msg,
    ILogger log)
{
    
    log.LogInformation("Getting companies");
    var companies = await _myService.GetCompaniesAsync(); //here how to pass cancellation token?
    log.LogInformation($"Found {companies.companies.Count} companies.");

    companies.companies.ForEach(msg.Add);

    log.LogInformation($"{companies.companies.Count} companies added to queue.");
}
解答

1. 如何传递CancellationToken

Durable Activity函数里,IDurableOrchestrationContext自带Token属性,这就是你需要的取消令牌,直接传给异步方法即可:

修改调用代码:

var companies = await _myService.GetCompaniesAsync(context.Token);

同时要确保GetCompaniesAsync方法支持接收CancellationToken参数,比如方法定义改成:

public async Task<CompanyResponse> GetCompaniesAsync(CancellationToken cancellationToken = default)
{
    // 内部发起HTTP请求时把令牌传进去,比如用HttpClient:
    var response = await _httpClient.GetAsync("https://api.example.com/companies", cancellationToken);
    // 后续处理逻辑...
}

2. 是否有必要传递该令牌

非常有必要,理由如下:

  • 当Durable Orchestrator主动取消Activity(比如超时、被终止、手动取消)时,context.Token会触发取消信号,能及时终止正在进行的HTTP请求,避免浪费资源。
  • 如果HTTP请求耗时较长,一旦Azure平台回收函数实例(比如空闲超时、资源调整),取消令牌可以让请求立即中断,避免无效的网络请求和计算。
  • 这是异步编程的最佳实践,确保异步操作能响应外部取消信号,提升系统可靠性和资源利用率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 15:55:17