azure-functions - 使用 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
-正是我所做的。
解决方案
当一个IDurableOrchestrationContext
方法抛出这个异常时,这意味着您使用一个线程而不是编排器线程调用了该方法。这里的问题不一定与CallHttpAsync
调用有关,而是代码中的其他内容启动了一个新线程这一事实。在大多数情况下,这是由前几行代码中的非法await
语句引起的 - 例如.await Task.Delay(1000)
如果您可以使用完整的编排描述更新您的帖子,那么我们应该能够更轻松地指出问题所在。
此外,考虑使用Durable Functions Roslyn Analyzer来帮助主动检测这些类型的编码错误(本周晚些时候将推出一个新版本,修复了一系列已知问题)。
推荐阅读
- ios - iOS - JSONSerialization VS JSONDecoder 和使用
- plugins - Intellij 没有下载插件
- python - 如何绘制对象的特定或多个轮廓
- mysql - 如何以 root 身份运行 brew?
- python - 如何在读取 excel 文件时直接解析数据框中的日期,而不是使用 parse_dates 参数?
- c# - 使用 for 循环检查字符串定义的数组元素
- java - 解析传入的短信 Android (API 26)
- c# - 发布后检索具有多个列表对象的 ViewModel
- mysql - MySQL优化几何查询
- shell - 当我在 docker 容器中执行 shell 脚本时,错误是“没有这样的文件或目录”