使用 context.CallHttpAsyn 时“检测到多线程执行”

Mar*_*lit 3 azure-functions azure-durable-functions

我有一个 OrchestrationTrigger 函数,可以通过 http 请求调用另一个服务。

 [FunctionName("MyFunc")]
        public async Task RunOrchestrator(
        [OrchestrationTrigger] IDurableOrchestrationContext context,
        ILogger logger)
    {
        var req = new DurableHttpRequest(HttpMethod.Post, _uri, headers, jsonBody);
        var res = await context.CallHttpAsync(req);
        // Do something
    }
Run Code Online (Sandbox Code Playgroud)

但出现以下错误:

检测到多线程执行。如果 Orchestrator 函数代码等待的任务不是由 DurableOrchestrationContext 方法创建的,则可能会发生这种情况。更多详细信息可以在这篇文章中找到 :https://learn.microsoft.com/en-us/azure/azure-functions/durable-functions-checkpointing-and-replay#orchestrator-code-constraints

那里的官方文档建议使用 context.CallHttpAsync- 正是我所做的。

Chr*_*lum 5

IDurableOrchestrationContext方法抛出此异常时,意味着您使用协调器线程以外的线程调用该方法。这里的问题不一定是调用CallHttpAsync,而是代码中的其他内容启动了一个新线程。在大多数情况下,这是由前一行代码await中的非法语句引起的 - 例如.await Task.Delay(1000)

如果您可以使用完整的编排描述更新您的帖子,那么我们应该能够更轻松地指出问题所在。

另外,请考虑使用Durable Functions Roslyn 分析器来帮助主动检测这些类型的编码错误(本周晚些时候将推出一个新版本,修复了一系列已知问题)。