火与火忘记Azure Functions中的调用

时间:2018-04-27 16:38:01

标签: c# azure azure-functions

我在Azure函数中有一个长时间运行的任务,我想使用Task.Run在后台线程中运行。我不关心结果。

public static async Task Run(...)
{
 var taskA = await DoTaskA();     
 Task.Run(new Action(MethodB));
 ....
 // return result based on taskA
}

这是Azure功能中可接受的模式吗? (这是HTTP触发器功能)

我知道这也可以通过向队列添加消息并让另一个函数执行此任务来完成,但我想知道在Azure函数的后台线程中开始运行长时间运行任务的优缺点。

3 个答案:

答案 0 :(得分:2)

最好有一个Azure Function正在运行TaskA并让它在ServiceBus中发布一条消息,这会在另一个Azure Function运行TaskB时触发在ServiceBus发布了一些内容,因为无论如何都不需要回答。

以下是microsoft's website上显示的示例:

[FunctionName("FunctionB")]                    
public static void Run(
    [ServiceBusTrigger("myqueue", AccessRights.Manage, Connection = "ServiceBusConnection")] 
    string myQueueItem, 
    TraceWriter log)
{
    log.Info($"C# ServiceBus queue trigger function processed message: {myQueueItem}");
    MethodB();
}

在这种情况下,您不必开始新任务。只需致电MethodB()

这将为您提供调整Azure Functions(应用服务与消费计划)计划的灵活性,并最大限度地降低总体成本。

答案 1 :(得分:1)

根据您的方案的复杂程度,您可能需要查看Durable Functions。持久功能使您可以更好地控制各种场景,包括长时间运行的任务。

答案 2 :(得分:0)

不,不,不。

让您的HTTP触发函数返回202 Accepted,稍后您将结果发布到blob网址。 202应该包含一个Location标题,指向即将存在的 blob网址,如果您大致了解处理需要多长时间,也可以包含Retry-after标题。

长处理任务应该是队列触发的功能。为什么?因为事情并不总是按计划进行,您可能需要重试处理。为什么不重置内置。