首页 > 解决方案 > 使用 context.CallHttpAsyn 时“检测到多线程执行”

问题描述

我有一个 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
    }

但得到以下错误:

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

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

标签: azure-functionsazure-durable-functions

解决方案


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

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

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


推荐阅读