Azure functions IDurableOrchestrationContext.SetCustomStatus不会立即更新状态

Azure functions IDurableOrchestrationContext.SetCustomStatus不会立即更新状态,azure-functions,Azure Functions,目标是使用IDurableOrchestrationContext.SetCustomStatus调用更新编排器的自定义状态。 下面是代码示例,但该点在开始时设置为自定义状态(“检查”)。检查是否有任何“正在运行”或“正在检查”的实例 在下面的例子中,我设置了自定义状态并立即检查它(在将来,如果有实例正在运行,管弦乐队将暂停,稍后再次检查,等待轮到它) 问题在于:如果我在设置状态后立即检查状态(使用.listInstanceAsync()API),则不会返回具有自定义状态的实例。。。 如果我在调

目标是使用IDurableOrchestrationContext.SetCustomStatus调用更新编排器的自定义状态。 下面是代码示例,但该点在开始时设置为自定义状态(“检查”)。检查是否有任何“正在运行”或“正在检查”的实例

在下面的例子中,我设置了自定义状态并立即检查它(在将来,如果有实例正在运行,管弦乐队将暂停,稍后再次检查,等待轮到它) 问题在于:如果我在设置状态后立即检查状态(使用.listInstanceAsync()API),则不会返回具有自定义状态的实例。。。 如果我在调用之间放置一些活动(设置状态和获取状态),我就能够获得正确的实例

似乎IDurableOrchestrationContext.SetCustomStatus调用需要一些时间来实际设置Azure存储表中的自定义状态。。。在此处设置/获取自定义状态的推荐方法是什么?

public static class Class1
{
    [FunctionName(nameof(TriggerAsync))]
    public static async Task TriggerAsync(
        [DurableClient] IDurableOrchestrationClient orchestrationClient,
        //[TimerTrigger("0 */1 * * * *")] TimerInfo timer,
        [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
        ILogger logger)
    {
        logger.LogWarning("Trigger. Starting new orchestration");
        var id = await orchestrationClient.StartNewAsync(nameof(OrchestrationAsync));
        logger.LogWarning("Trigger. Started new orchestration");
    }

    [FunctionName(nameof(OrchestrationAsync))]
    public static async Task OrchestrationAsync(
        [OrchestrationTrigger] IDurableOrchestrationContext context,
        [DurableClient] IDurableOrchestrationClient starter,
        ILogger log)
    {
        var logger = context.CreateReplaySafeLogger(log);

        try
        {
            context.SetCustomStatus("Superb");

            logger.LogWarning($"Orchestration. GetInstances Start");
            var instances = await context.CallActivityAsync<int>("GetInstances", null);
            logger.LogWarning($"Orchestration. GetInstances result: {instances}");
            logger.LogWarning($"Orchestration. GetInstances End");

            logger.LogWarning($"Orchestration. Activity1 Start");
            await context.CallActivityAsync("Activity1", null);
            logger.LogWarning($"Orchestration. Activity1 End");
        }
        catch
        {
            logger.LogWarning($"Orchestration. Error");
            throw;
        }

        logger.LogWarning($"Orchestration. Done");
    }

    [FunctionName(nameof(Activity1))]
    public static async Task Activity1(
        [ActivityTrigger] IDurableActivityContext context,
        [DurableClient] IDurableOrchestrationClient starter,
        ILogger logger)
    {
        var rnd = new Random();
        var rndNum = rnd.Next(60);

        logger.LogWarning($"Activity. Doing some work with {rndNum} seconds duration");
        await Task.Delay(new TimeSpan(0, 0, rndNum));
    }

    [FunctionName(nameof(GetInstances))]
    public static async Task<int> GetInstances(
        [ActivityTrigger] IDurableActivityContext context,
        [DurableClient] IDurableOrchestrationClient starter,
        ILogger logger)
    {
        var statuses = new List<OrchestrationRuntimeStatus>
        {
            OrchestrationRuntimeStatus.Running,
            OrchestrationRuntimeStatus.Pending
        };

        var condition = new OrchestrationStatusQueryCondition
        {
            RuntimeStatus = statuses
        };

        var response = await starter.ListInstancesAsync(condition, CancellationToken.None);
        return response.DurableOrchestrationState.Count(x => x.CustomStatus.ToString() == "Superb");
    }
}
公共静态类Class1
{
[函数名(名称(TriggerAsync))]
公共静态异步任务触发器同步(
[DurableClient]IDurableOrchestrationClient orchestrationClient,
//[TimerTrigger(“0*/1****”)TimerInfo计时器,
[HttpTrigger(AuthorizationLevel.Function,“get”,“post”,Route=null)]HttpRequest请求,
ILogger(记录器)
{
logger.LogWarning(“触发器.启动新业务流程”);
var id=await orchestrationClient.StartNewAsync(nameof(OrchestrationAsync));
logger.LogWarning(“触发器.启动新业务流程”);
}
[函数名(名称(OrchestrationAsync))]
公共静态异步任务编排同步(
[OrchestrationTrigger]IDurableOrchestrationContext上下文,
[DurableClient]IdurableCorchestrationClient启动器,
ILogger日志)
{
var logger=context.createReplaySafeloger(日志);
尝试
{
context.SetCustomStatus(“超级”);
logger.LogWarning($“Orchestration.GetInstances Start”);
var instances=await context.CallActivityAsync(“GetInstances”,null);
logger.LogWarning($“Orchestration.GetInstances结果:{instances}”);
logger.LogWarning($“Orchestration.GetInstances End”);
logger.LogWarning($“Orchestration.Activity1 Start”);
wait context.CallActivityAsync(“Activity1”,null);
logger.LogWarning($“Orchestration.Activity1 End”);
}
抓住
{
logger.LogWarning($“Orchestration.Error”);
投掷;
}
logger.LogWarning($“Orchestration.Done”);
}
[功能名称(活动名称1))]
公共静态异步任务活动1(
[ActivityTrigger]IDurableActivityContext上下文,
[DurableClient]IdurableCorchestrationClient启动器,
ILogger(记录器)
{
var rnd=新随机数();
var rndNum=rnd.Next(60);
logger.LogWarning($“Activity.do some work with{rndNum}seconds duration”);
等待任务延迟(新的时间跨度(0,0,rndNum));
}
[FunctionName(nameof(GetInstances))]
公共静态异步任务GetInstances(
[ActivityTrigger]IDurableActivityContext上下文,
[DurableClient]IdurableCorchestrationClient启动器,
ILogger(记录器)
{
变量状态=新列表
{
OrchestrationRuntimeStatus.Running,
OrchestrationRuntimeStatus.Pending
};
var条件=新业务流程statusquerycondition
{
RuntimeStatus=状态
};
var response=await starter.listInstanceAsync(条件,CancellationToken.None);
返回response.DurableOrchestrationState.Count(x=>x.CustomStatus.ToString()==“超级”);
}
}

您的编排器似乎至少违反了其中一条规则,它不应该阻塞异步任务。框架很可能会在下次从函数返回执行时设置状态(wait/return)。你最终想要实现什么?@juunas,更新一下我的例子。由httpTrigger触发,另外我将GetInstances调用包装到一个活动中,现在使用wait,所以它不会阻止任何东西。但是结果是一样的-GetInstances活动不返回任何具有自定义状态的实例,但是状态是在GetInstances调用之前设置的…是的,现在看起来更正确了,必须查看DF源代码,以查看它在内部对该自定义状态的实际操作。如果我记得函数本身只是序列化了您提供的输入,并设置了一些字段。@juunas,非常感谢您的帮助@juunas,如果我在github上的QA中直接询问同样的问题,会有帮助吗-