异步编程和Azure函数

9 浏览
0 Comments

异步编程和Azure函数

在Azure函数的“性能考虑”部分,函数最佳实践中,在“使用异步代码但避免阻塞调用”中,推荐使用async编程来提高性能。然而,如何最好地使用它呢?例如,在我的场景中,我有以下的Service Bus触发器:\n

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

\n在上述代码中,我调用了PushToDb方法,并标记为async。然而,由于它在后台运行,函数运行时会认为消息已成功消费并完成。那么,如果PushToDb方法抛出异常怎么办?我该如何确保运行时知道它尚未完成,而应该被放弃?\n希望尽可能多地使用async来提高性能。

0
0 Comments

异步编程和Azure函数的出现原因是为了更好地处理异步任务和异常处理。解决方法是使用async和await关键字来使函数变为异步,并返回一个Task对象。在这种情况下,可以使用await关键字来等待调用,并能够正常处理异常。但是,异步函数不能具有ref或out参数,所以如何从异步函数进行输出绑定呢?可以通过绑定返回值或使用IAsyncCollector来实现输出绑定。

下面是示例代码:

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

函数运行时允许将函数定义为异步并返回一个Task对象。通过使用async和await关键字,我们能够处理异步任务并能够正常处理异常。然而,需要注意的是,异步函数不能具有ref或out参数。所以,如果需要从异步函数进行输出绑定,可以通过绑定返回值或使用IAsyncCollector来实现。

关于如何从异步函数进行输出绑定的更多详细信息可以参考stackoverflow上的这个回答

通过将函数定义为异步并返回一个Task对象,我们可以更好地处理异步任务和异常处理。在异步函数中,可以使用await关键字来等待调用,并能够正常处理异常。但是需要注意的是,异步函数不能具有ref或out参数。如果需要从异步函数进行输出绑定,可以通过绑定返回值或使用IAsyncCollector来实现。

0