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

时间:2020-05-28 09:12:47

标签: azure azure-durable-functions

像这样循环调用活动函数是否可以:?

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吗?

以上内容均有效。但是我不确定这是否是正确的解决方法。

1 个答案:

答案 0 :(得分:1)

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

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);

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