gpt4 book ai didi

c# - 必须在编排客户端上等待 StartNewAsync 吗?

转载 作者:行者123 更新时间:2023-12-03 00:38:36 25 4
gpt4 key购买 nike

我有一个 Azure 编排,其中触发编排的编排客户端引发了超时异常。

编排客户端功能只做两件事,启动两个编排,等待每个编排,正如大多数示例代码所建议的那样。

await orchestrationClient.StartNewAsync("TableOrchestrator", updates);
await orchestrationClient.StartNewAsync("ClientOrchestrator", clientExport);

但是,据我了解,编排客户端并不是像编排功能那样的特殊功能,因此它最多只能运行10分钟。显然,我的两个编排的总运行时间很可能超过 10 分钟。

问题:

  1. 编排客户端状态是否像实际编排函数一样保存?
  2. 我是否需要等待不依赖于先前编排结果的编排?

更新制作了我的代码功能和运行时的完整示例,如下所示。

如果之后编写了代码,则启动编排似乎会等待它,但如果编排是最后一条语句,则不会!

更新的问题:

  1. 调用 StartNewAsync() 后的任何代码都会使函数等待直到编排真正完成吗?或将例如log 语句不会触发此行为?
  2. 建议的代码实践是仅在所有其他代码执行后才调用 StartNewAsync() 吗?

.

public static class testOrchestration
{
[FunctionName("Start")]
public static async Task Start([TimerTrigger("0 */30 * * * *", RunOnStartup = true, UseMonitor = false)]TimerInfo myStartTimer, [OrchestrationClient] DurableOrchestrationClient orchestrationClient, ILogger log)
{
var startTime = DateTime.Now;
log.LogInformation(new EventId(0, "Startup"), "Starting Orchestror 1 ***");

await orchestrationClient.StartNewAsync("Orchestrator", "ONE");
log.LogInformation($"Elapsed time, await ONE: {DateTime.Now - startTime}");

await Task.Delay(5000);
log.LogInformation($"Elapsed time, await Delay: {DateTime.Now - startTime}");

log.LogInformation(new EventId(0, "Startup"), "Starting Orchestror 2 ***");
await orchestrationClient.StartNewAsync("Orchestrator", "TWO");
log.LogInformation($"Elapsed time, await TWO: {DateTime.Now - startTime}");
}


[FunctionName("Orchestrator")]
public static async Task<string> TestOrchestrator([OrchestrationTrigger] DurableOrchestrationContextBase context, ILogger log)
{
var input = context.GetInput<string>();
log.LogInformation($"Running {input}");
await Task.Delay(5000);

return $"Done {input}";
}
}

运行它会给出以下输出:

Starting Orchestror 1 ***
Elapsed time, await ONE: 00:00:08.5445755
Running ONE
Elapsed time, await Delay: 00:00:13.5541264
Starting Orchestror 2 ***
Elapsed time, await TWO: 00:00:13.6211995
Running TWO

最佳答案

StartNewAsync() 只是安排编排器启动(立即)。等待这些调用并不意味着您的初始函数将真正等待协调器运行 - 甚至真正开始和完成其工作。

The StartNewAsync (.NET) or startNew (JavaScript) method on the orchestration client binding starts a new instance. Internally, this method enqueues a message into the control queue, which then triggers the start of a function with the specified name that uses the orchestration trigger binding.

This async operation completes when the orchestration process is successfully scheduled

Source

当编排进程成功调度时,此异步操作完成。

所以是的:您应该等待这些调用(也可以按照 Miguel 的建议并行完成)。但不会超过几毫秒。

关于c# - 必须在编排客户端上等待 StartNewAsync 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60425865/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com