Azure Functions - 运行 另一个线程中的长时间操作

Azure Functions - run long operation in another thread

我正在尝试使用 Azure Functions 解决方案实现文件转换。转换可能需要很长时间。因此我不想等待调用服务器上的响应。 我编写了 returns 立即响应的函数(以指示服务可用并开始转换)和 运行s 转换在单独的线程中。回调URL用于发送转换结果

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, Stream srcBlob, Binder binder, TraceWriter log)
{
    log.Info($"C# HTTP trigger function processed a request. RequestUri={req.RequestUri}");

    // Get request model
    var input = await req.Content.ReadAsAsync<ConvertInputModel>();

    //Run convert in separate thread
    Task.Run( async () => {
        //Read input blob -> convert -> upload output blob
        var convertResult = await ConvertAndUploadFile(input, srcBlob, binder, log);

        //return result using HttpClient
        SendCallback(convertResult, input.CallbackUrl); 
    });

    //Return response immediately
    return req.CreateResponse(HttpStatusCode.OK);
}

新任务破坏绑定的问题。访问参数时出现异常。那么如何才能运行长时间单独运行呢?或者这样的解决方案是完全错误的?

您对 运行在 Azure Function 中设置后台工作的解决方案与您怀疑的一样是错误的。您需要一项旨在 运行 这些长期 运行ning 任务的第二项服务。 Here is documentation to Micosoft's best practices on azure for doing background jobs

Azure Functions 不推荐(或不支持)此模式。特别是当 运行ning 在消耗计划中时,由于 运行时间将无法准确管理您的函数的生命周期,最终会关闭您的服务。

此处推荐(且广泛使用)的模式之一是将此工作排队等待另一个函数处理,侦听该队列,并return立即响应客户端。

使用这种方法,您基本上完成了相同的事情,其中​​实际处理将异步完成,但以可靠和高效的方式完成(如果需要,受益于自动缩放以正确处理增加的负载)

请记住,使用消费计划时,有 5 分钟的功能超时。如果预计处理时间更长,您需要 运行 在启用 AlwaysOn 的专用计划中使用您的函数。