Как связать выходные значения с моей функцией async Azure?

Как я могу привязать свои выходы к функции async? Обычный метод установки параметра для out не работает с функциями асинхронными.

пример

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

Это приводит к компиляции Ошибка:

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

Используемое связывание (fyi)

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

Ответ 1

Есть несколько способов сделать это:

Свяжите выход с возвращаемым значением функции (проще всего)

Затем вы можете просто вернуть значение из своей функции. Вам нужно будет установить имя привязки вывода к $return, чтобы использовать этот метод

Код

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

переплет

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

Свяжите вывод с IAsyncCollector

Привяжите вывод к 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);
}

переплет

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

Ответ 2

У меня еще нет репутации, чтобы иметь возможность сделать комментарий, но в коде Zain Rizvi выше, он должен сказать, что 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);
}

Ответ 3

Асинхронные методы могут нормально возвращать значения, но вы не должны возвращать чистый тип значения, вместо этого используйте "Задача":

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