需要帮助了解 Azure Functions 中 async/await 调用中的后台任务
Need help understanding background tasks in async/await calls in Azure Functions
我一直在 Azure Functions 中使用 C# 创建服务。我已阅读有关如何最佳使用 async/await 的指南,但不了解它在 Azure 函数上下文中的价值。
在我的 Azure 函数中,我对外部 API 进行了 3 次调用。我尝试使用 async/await 来启动我的 API 调用。这个想法是前两个任务 return 每个任务一个列表,它们将被连接起来,然后与第三个列表进行比较。
比较完成后,所有项目都被发送到存储容器队列,供另一个使用队列触发器的函数处理。
我的异步实现如下:
var firstListTask = GetResourceListAsync(1);
var secondListTask = GetResourceListAsync(2);
var thirdListTask = GetOtherResourceListAsync(1);
var completed = await Task.WhenAll(firstListTask, secondListTask);
var resultList = completed[0].Concat(completed[1]);
var compareList = await thirdListTask;
// LINQ here to filter out resultList based on compareList
运行 以上,我得到大约 38 秒的执行时间。
我对异步实现的理解是我启动了所有 3 个异步调用以获取我的列表。
- 前两个任务等待
'await Task.WhenAll...'
- 此时线程退出异步方法和 'does something else' 直到 API return 有效负载
- API 收到有效负载,然后恢复该方法并继续执行下一条指令(连接两个列表)
- 然后使用
'await thirdListTask'
等待第三个任务,它退出异步方法和 'does something else' 直到 API return 有效负载
- API 接收到payload,然后恢复该方法并继续执行下一条指令(过滤列表)
现在,如果我 运行 同步执行相同的代码,我的执行时间约为 40 秒:
var firstList = GetResourceList(1)
var secondList = GetResourceList(2);
var resultList = firstList.Concat(secondListTask)
var compaireList = GetOtherResourceList(1);
var finalList = // linq query to filter out resultList based on compareList
我可以看到异步函数 运行s 比同步函数快 2 秒,我假设这是因为 thirdListTask
与 firstListTask
和 secondListTask
?
我的异步实现问题是我不明白 'does something else' 在 Azure Functions 的上下文中需要什么。根据我的理解,除了下一行的操作之外别无他法,但是直到有效负载从 API.
编辑 return 后,它才能在那里进行
此外,下面的代码示例是否与我的第一个异步实现做同样的事情?看到 Azure Functions 的示例对每个异步调用都使用 await,只是为了等待下一行中的另一个调用,我感到非常困惑。
var firstList = await GetResourceListAsync(1);
var secondList = await GetResourceListAsync(2);
var resultList = firstList.Concat(secondList);
var compareList= await GetOtherResourceListAsync(1);
// LINQ here to filter out resultList based on compareList
我已经尝试阅读 Azure Functions 的 MS 最佳实践以及 Whosebug 上 async/await 的类似问题,但我似乎无法理解以上内容。谁能帮助简化这个?
var firstListTask = GetResourceListAsync(1);
var secondListTask = GetResourceListAsync(2);
var thirdListTask = GetOtherResourceListAsync(1);
这将启动所有 3 个任务。所有 3 API 个调用现在都是 运行。
var completed = await Task.WhenAll(firstListTask, secondListTask);
此异步等待两个任务完成。它释放了线程去“做其他事情” 这是什么其他事情?无论框架需要什么。这是一个被释放的资源,因此它可以用于 运行 另一个异步操作的延续等
var compareList = await thirdListTask;
此时,您的 API 调用很可能已经完成,因为它是从其他 2 个调用开始的。如果完成,await
将提取值或抛出异常如果任务出错。如果它仍在进行中,它将异步等待它完成,释放线程以“去做其他事情”
var firstList = await GetResourceListAsync(1);
var secondList = await GetResourceListAsync(2);
var resultList = firstList.Concat(secondList);
var compareList= await GetOtherResourceListAsync(1);
这与您的第一个示例不同。如果例如您的所有 API 调用都需要 5 秒才能完成,总 运行 时间将为 15 秒,因为您会依次启动并等待它完成。在您的第一个示例中,总 运行 时间大约为 5 秒,因此快了 3 倍。
我一直在 Azure Functions 中使用 C# 创建服务。我已阅读有关如何最佳使用 async/await 的指南,但不了解它在 Azure 函数上下文中的价值。
在我的 Azure 函数中,我对外部 API 进行了 3 次调用。我尝试使用 async/await 来启动我的 API 调用。这个想法是前两个任务 return 每个任务一个列表,它们将被连接起来,然后与第三个列表进行比较。
比较完成后,所有项目都被发送到存储容器队列,供另一个使用队列触发器的函数处理。
我的异步实现如下:
var firstListTask = GetResourceListAsync(1);
var secondListTask = GetResourceListAsync(2);
var thirdListTask = GetOtherResourceListAsync(1);
var completed = await Task.WhenAll(firstListTask, secondListTask);
var resultList = completed[0].Concat(completed[1]);
var compareList = await thirdListTask;
// LINQ here to filter out resultList based on compareList
运行 以上,我得到大约 38 秒的执行时间。 我对异步实现的理解是我启动了所有 3 个异步调用以获取我的列表。
- 前两个任务等待
'await Task.WhenAll...'
- 此时线程退出异步方法和 'does something else' 直到 API return 有效负载 - API 收到有效负载,然后恢复该方法并继续执行下一条指令(连接两个列表)
- 然后使用
'await thirdListTask'
等待第三个任务,它退出异步方法和 'does something else' 直到 API return 有效负载 - API 接收到payload,然后恢复该方法并继续执行下一条指令(过滤列表)
现在,如果我 运行 同步执行相同的代码,我的执行时间约为 40 秒:
var firstList = GetResourceList(1)
var secondList = GetResourceList(2);
var resultList = firstList.Concat(secondListTask)
var compaireList = GetOtherResourceList(1);
var finalList = // linq query to filter out resultList based on compareList
我可以看到异步函数 运行s 比同步函数快 2 秒,我假设这是因为 thirdListTask
与 firstListTask
和 secondListTask
?
我的异步实现问题是我不明白 'does something else' 在 Azure Functions 的上下文中需要什么。根据我的理解,除了下一行的操作之外别无他法,但是直到有效负载从 API.
编辑 return 后,它才能在那里进行此外,下面的代码示例是否与我的第一个异步实现做同样的事情?看到 Azure Functions 的示例对每个异步调用都使用 await,只是为了等待下一行中的另一个调用,我感到非常困惑。
var firstList = await GetResourceListAsync(1);
var secondList = await GetResourceListAsync(2);
var resultList = firstList.Concat(secondList);
var compareList= await GetOtherResourceListAsync(1);
// LINQ here to filter out resultList based on compareList
我已经尝试阅读 Azure Functions 的 MS 最佳实践以及 Whosebug 上 async/await 的类似问题,但我似乎无法理解以上内容。谁能帮助简化这个?
var firstListTask = GetResourceListAsync(1);
var secondListTask = GetResourceListAsync(2);
var thirdListTask = GetOtherResourceListAsync(1);
这将启动所有 3 个任务。所有 3 API 个调用现在都是 运行。
var completed = await Task.WhenAll(firstListTask, secondListTask);
此异步等待两个任务完成。它释放了线程去“做其他事情” 这是什么其他事情?无论框架需要什么。这是一个被释放的资源,因此它可以用于 运行 另一个异步操作的延续等
var compareList = await thirdListTask;
此时,您的 API 调用很可能已经完成,因为它是从其他 2 个调用开始的。如果完成,await
将提取值或抛出异常如果任务出错。如果它仍在进行中,它将异步等待它完成,释放线程以“去做其他事情”
var firstList = await GetResourceListAsync(1);
var secondList = await GetResourceListAsync(2);
var resultList = firstList.Concat(secondList);
var compareList= await GetOtherResourceListAsync(1);
这与您的第一个示例不同。如果例如您的所有 API 调用都需要 5 秒才能完成,总 运行 时间将为 15 秒,因为您会依次启动并等待它完成。在您的第一个示例中,总 运行 时间大约为 5 秒,因此快了 3 倍。