foreach循环中的Azure持久函数调用活动性函数。可以吗?

问题描述 投票:0回答:1

是否可以在循环中调用活动函数,例如:?

foreach(var item in items)
{
    await context.CallActivityWithRetryAsync(....,item,...);
}

扩展这个问题,我需要在循环内依次执行2个活动

var tasks = new List<Task<TypeA>>();

foreach(var item in items)
{
    var task = context.CallActivityWithRetryAsync(Activity2Name,item,...);

    tasks.Add(task);

    task.ContinueWith(t => {
        var innerTask =  context.CallActivityWithRetryAsync(Activity3Name,t.Result,...);
        return innerTask;
    },TaskContinuationOptions.ExecuteSynchronously );
}
await Task.WhenAll(tasks);

我也许应该以某种方式将内部任务添加到任务集合中,所以等待将等待所有任务。然后摆脱TaskContinuationOptions.ExecuteSynchronously?

以上是可行的。但我不确定这是否是正确的解决方法。

azure azure-durable-functions
1个回答
1
投票

这是一个好问题。我不是百分百确定是否有问题,但这是我的猜测:您的持久上下文将被执行多次,因此您最好等待循环外的所有活动。

var tasks = new Task<long>[files.Length];
for (int i = 0; i < files.Length; i++)
{
        tasks[i] = context.CallActivityWithRetryAsync("FunctionName", files[i]);
}

await Task.WhenAll(tasks);

至少这是我在项目中一直成功使用的方式

© www.soinside.com 2019 - 2024. All rights reserved.