web-dev-qa-db-fra.com

Programmation asynchrone et fonctions Azure

Dans la partie "Considérations sur les performances" des fonctions Azure, Fonctions pratiques recommandées , sous "Utiliser du code asynchrone mais éviter de bloquer les appels", la programmation async est la pratique suggérée pour l'amélioration des performances. Cependant, quelle est la meilleure façon de l'utiliser? Par exemple, dans mon scénario, j'ai le déclencheur Service Bus suivant:

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

Dans le code ci-dessus, j'appelle la méthode PushToDbasync. Cependant, étant donné qu'il s'exécute en arrière-plan, le runtime Function suppose que les messages sont correctement consommés et le termine. Que faire si la méthode PushToDb lève une exception? Comment puis-je m'assurer que le runtime sait qu'il n'est pas terminé, mais doit plutôt être abandonné?

Vous cherchez à utiliser async autant que possible pour les performances.

24
Mandar Jogalekar

Vous pouvez rendre la fonction asynchrone:

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

Le runtime Functions vous permet de rendre votre fonction asynchrone et de retourner une tâche.

Dans ce cas, nous pouvons simplement attendre l'appel afin de pouvoir gérer les exceptions normalement.

53
juunas