foreach 循环中的 Azure 持久函数调用活动函数。可以吗?
Azure durable function call activtity function in foreach loop. Is it OK?
在循环中调用activity函数是否可以,像这样:?
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);
我或许应该以某种方式将内部任务添加到任务集合中,因此 await 将等待所有任务。然后去掉 TaskContinuationOptions.ExecuteSynchronously ?
以上内容有效。但我不确定这样做是否正确。
这是个好问题。我不是 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);
至少这是我在项目中成功使用的方式
在循环中调用activity函数是否可以,像这样:?
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);
我或许应该以某种方式将内部任务添加到任务集合中,因此 await 将等待所有任务。然后去掉 TaskContinuationOptions.ExecuteSynchronously ?
以上内容有效。但我不确定这样做是否正确。
这是个好问题。我不是 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);
至少这是我在项目中成功使用的方式