2017-01-17 30 views
1

我试图使用Azure函数解决方案来实现文件转换。转换可能需要很长时间。因此我不想等待呼叫服务器上的响应。 我写了函数立即返回响应(以表明服务可用并开始转换)并在单独的线程中运行转换。回叫网址用于发送转换结果。Azure函数 - 在另一个线程中运行长操作

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); 
} 

新任务中断绑定的问题。访问params时我得到异常。那么我怎样才能在单独的胎面上运行长时间的操作呢?或者这样的解决方案完全错误?

+0

我不知道Azure函数的内部实现,但如果您可以运行这样的后台任务,我会感到非常惊讶。你需要一个新的设计,比如像在一个队列中放置一条消息,然后让另一个进程,比如一个web作业,选择它。 – Crowcoder

回答

7

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

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

通过这种方法,你基本上完成同样的事情,在实际的处理会异步完成,但在一个可靠和有效的方式(受益于自动进行调整,妥善处理增加的负荷,如果需要的话)

待办事项请记住,使用消费计划时,会有5分钟的功能超时。如果预计处理时间较长,则需要在启用了AlwaysOn的专用计划中运行您的功能。

+1

有没有关于这方面的一些文件,我可以指出? –

相关问题