分解活动功能



我有一个Activity函数,它读取组织中父级的子元素,如下所示:

[FunctionName("ChildReaderFunction")]
public async Task<List<User>> GetChildren([ActivityTrigger] User parent)
{
var children = await GetChildrenAsync(parent);
return children;
}
public async Task<List<User>> GetChildrenAsync(User parent)
{        
var allUsers = new List<User> { parent };
List<User> children = null;

children = await ExecuteQueryAsync("tableName", $"Parent eq '{parent.Id}'");
var taskIndex = 0;
var readTasks = new Task<List<User>>[children.Count(x => x.Childcount > 0)];
foreach (var child in children)
{
if (child.Childcount > 0)
{
readTasks[taskIndex++] = GetChildrenAsync(child);
}
else
{
allUsers.Add(child);
}
}
var validTasks = readTasks.Where(task => task != null).ToList();
if (validTasks.Count > 0)
{
foreach (var result in await Task.WhenAll(validTasks))
{
allUsers.AddRange(result);
}
}
Console.WriteLine($"Got {allUsers.Count} children for {parent.Id}");
return allUsers;
}

当我使用超时2小时的高级计划时,这非常有效。我正试图将其转换为超时为10分钟的消耗计划。在测试时,我看到超时异常。有没有办法分解这个持久的功能并在10分钟内完成执行?

我尝试使用如下队列来更新此逻辑:

[FunctionName("ChildReaderFunction")]
public async Task<List<User>> GetChildren([ActivityTrigger] User parent)
{
var allUsers = new List<User>();
var directReportEntities = new List<User>();
Queue<User> myQueue = new Queue<Person>();
myQueue.Enqueue(request.Parent);
while (myQueue.Any())
{
var current = myQueue.Dequeue();
if (current.Childcount > 0)
{
var children = await GetChildrenAsync(parent);
foreach (var child in children)
{
myQueue.Enqueue(child);
}
}
allUsers.Add(current);
}
Console.WriteLine($"Got {allUsers.Count} children for {parent.Id}");
return allUsers;
}
public async Task<List<User>> GetChildrenAsync(User parent)
{
return await ExecuteQueryAsync("tableName", $"Parent eq '{parent.Id}'");
}

这也会产生超时异常。有什么建议我可以尝试其他方法吗?

您可能会考虑找出此方法的哪些部分速度较慢。也许不是方法本身慢,而是对数据库的查询慢。您要下载多少行?

此外,您的方法中有一个递归调用。这可能会导致执行许多查询。你能想出一种不同的方法来一次获取所有数据,而不是一次获取一点点数据吗?

最新更新