异步编程和Azure功能

Man*_*kar 23 c# azure azure-functions

在Azure功能性能注意事项部分,https://docs.microsoft.com/en-us/azure/azure-functions/functions-best-practices 在使用异步代码但避免阻止调用异步编程是性能改进的建议做法无论什么是使用它的最佳方式.例如,在我的观点中,我有一个服务总线触发器

public static void Run([ServiceBusTrigger("topicname", "subname", 
     AccessRights.Manage, Connection = "TopicConnection")]string message, 
      TraceWriter log)
     {
     try {
        log.Info($"C# ServiceBus topic trigger function processed message: 
           {message}");

    Task.Run(() => PushToDb(message, log));
    }
    catch(Exception ex)
    {
        log.Info($"Exception found {ex.Message}");
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我调用了PushToDb方法异步,但由于它在后台运行,因此Function运行时假定消息已成功使用并完成它.如果PushToDb方法抛出异常怎么办?如何确保运行时知道它不完整,而应该放弃.

希望尽可能多地使用异步来提高性能.

juu*_*nas 42

您可以使函数异步:

public static async Task Run(
    [ServiceBusTrigger("topicname", "subname", AccessRights.Manage, Connection = "TopicConnection")]string message,
    TraceWriter log)
{
    try
    {
        log.Info($"C# ServiceBus topic trigger function processed message: {message}");
        await PushToDb(message, log);
    }
    catch(Exception ex)
    {
        log.Info($"Exception found {ex.Message}");
    }
}
Run Code Online (Sandbox Code Playgroud)

函数运行时允许您使函数异步并返回任务.

在这种情况下,我们可以等待调用,以便我们可以正常处理异常.

  • @ user2202866像这样:https://stackoverflow.com/a/40409345/1658906。TL; DR:绑定返回值或使用IAsyncCollector。 (2认同)