web-dev-qa-db-fra.com

Comment lier les valeurs de sortie à ma fonction Azure asynchrone?

Comment lier mes sorties à une fonction asynchrone? La méthode habituelle de définition du paramètre sur out ne fonctionne pas avec les fonctions asynchrones.

Exemple

using System;

public static async void Run(string input, TraceWriter log, out string blobOutput)
{
    log.Info($"C# manually triggered function called with input: {input}");
    await Task.Delay(1);

    blobOutput = input;
}

Cela entraîne une erreur de compilation:

[timestamp] (3,72): error CS1988: Async methods cannot have ref or out parameters

Reliure utilisée (fyi)

{
  "bindings": [
    {
      "type": "blob",
      "name": "blobOutput",
      "path": "testoutput/{Rand-guid}.txt",
      "connection": "AzureWebJobsDashboard",
      "direction": "out"
    },
    {
      "type": "manualTrigger",
      "name": "input",
      "direction": "in"
    }
  ],
  "disabled": false
}
12
Zain Rizvi

Il y a plusieurs façons de le faire:

Lier la sortie à la valeur de retour de la fonction (Le plus facile)

Ensuite, vous pouvez simplement renvoyer la valeur de votre fonction. Vous devez définir le nom de la liaison de sortie sur $return pour pouvoir utiliser cette méthode.

Code

public static async Task<string> Run(string input, TraceWriter log)
{
    log.Info($"C# manually triggered function called with input: {input}");
    await Task.Delay(1);

    return input;
}

Contraignant

{
  "bindings": [
    {
      "type": "blob",
      "name": "$return",
      "path": "testoutput/{Rand-guid}.txt",
      "connection": "AzureWebJobsDashboard",
      "direction": "out"
    },
    {
      "type": "manualTrigger",
      "name": "input",
      "direction": "in"
    }
  ],
  "disabled": false
}

Lier la sortie à IAsyncCollector

Liez la sortie à IAsyncCollector et ajoutez votre élément au collecteur.

Vous voudrez utiliser cette méthode lorsque vous avez plusieurs liaisons de sortie.

Code

public static async Task Run(string input, IAsyncCollector<string> collection, TraceWriter log)
{
    log.Info($"C# manually triggered function called with input: {input}");
    await collection.AddAsync(input);
}

Contraignant

{
  "bindings": [
    {
      "type": "blob",
      "name": "collection",
      "path": "testoutput/{Rand-guid}.txt",
      "connection": "AzureWebJobsDashboard",
      "direction": "out"
    },
    {
      "type": "manualTrigger",
      "name": "input",
      "direction": "in"
    }
  ],
  "disabled": false
}
13
Zain Rizvi

Je n'ai pas encore la réputation de pouvoir faire un commentaire, mais dans le code ci-dessus de Zain Rizvi, il devrait être indiqué par IAsyncCollector:

public static async Task Run(string input, IAsyncCollector<string> collection, 
TraceWriter log)
{
    log.Info($"C# manually triggered function called with input: {input}");
    await collection.AddAsync(input);
}
2
Victor Pikula

Les méthodes asynchrones peuvent renvoyer des valeurs normalement, mais vous ne devriez pas renvoyer le type pur de valeur, utilisez plutôt Task comme ceci:

 public static async Task<string> Run(string input, TraceWriter log, string blobOutput)
    {
        log.Info($"C# manually triggered function called with input: {input}");
        await Task.Delay(1);

        blobOutput = input;
        return blobOutput;
    }