it-swarm.com.ru

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

Как я могу привязать свои выходы к асинхронной функции? Обычный метод установки параметра в 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

Связывание используется (к вашему сведению)

{
  "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

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

Привязать вывод к возвращаемому значению функции (Самый простой)

Тогда вы можете просто вернуть значение из вашей функции. Вам нужно будет установить имя выходной привязки на $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
}
13
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);
}
2
Victor Pikula

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

 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;
    }
0
Gabriel Schade Cardoso