【发布时间】:2019-10-30 19:58:02
【问题描述】:
我有一个 Azure 函数,它能够调用多个 API 端点,而无需等待其中任何一个端点的结果。
Azure 函数在计时器触发器上运行,每 10 秒运行一次。
我所有的 API 调用和调用它们的参数都存储在一个 SQL 表中。我想确保在不等待特定调用完成的情况下进行 API 调用。
这只是我将要做的事情的蓝图。
[FunctionName("FunctionScheduler")]
public static async Task RunAsync([TimerTrigger("*/10 * * * * *")]TimerInfo myTimer, ILogger log)
{
log.LogInformation("FUNCTION SCHEDULER STARTING ..");
log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
for(int i=0; i < 20; i++)
{
var task = Task.Run(() => ApiRef1(i, log));
var taskref = await task;
}
}
目前 ApiRef1() 只是打印出变量 i 的值。我得到了打印数字 0 到 19 的预期输出。我希望并行执行 ApiRef1() 方法,该方法最终将被类似这样的方法替换。
private static void CallApi(string apiName, string apiEndpoint, string methodType, string authenticationType, IDictionary<int, string> parameters, ILogger log)
{
try
{
log.LogInformation($"Call to API {apiName} started.." );
// Call API
}
catch (Exception ex)
{
log.LogInformation($"Exception {ex.Message} occurred.." );
}
}
有没有更好的方法来做到这一点,或者这种方法会奏效吗?
【问题讨论】:
-
如果您“解雇并忘记”任务,为什么要捕获每个任务的结果(使用
await)?还是您不再需要这样做了? -
这对于C# Discards来说是一个很好的用例
-
@gunr2171。我不需要这样。我可以使用 await Task.Run(() => ApiRef1(i, log));这会产生相同的结果。但这是否保证这是一种真正的“一劳永逸”方法
-
在这种情况下,您不能有真火而忘记,因为您需要确保在 Azure Function 终止之前完成任务。我会将为每次迭代创建的每个任务存储在一个列表中,并等待所有任务完成
Task.WhenAll(IEnumerable<Task>).Wait(); -
请记住,“一劳永逸”的意思是“我不在乎何时甚至如果这会成功”。你确定这就是你想要的吗?
标签: c# .net async-await nonblocking fire-and-forget