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

person Zain Rizvi    schedule 03.11.2016    source источник


Ответы (3)


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

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

Затем вы можете просто вернуть значение из своей функции. Вам нужно будет установить имя выходной привязки на $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
}
person Zain Rizvi    schedule 03.11.2016
comment
У меня проблема, когда я использую : ICollectorAsync : error CS0246: The type or namespace name 'ICollectorAsync<>' could not be found - person Jean-philippe Emond; 29.05.2017
comment
@Jean-philippeEmond извините, это должен был быть IAsyncCollector - person Zain Rizvi; 30.05.2017
comment
Сборщики не поддерживаются для выходных привязок BLOB-объектов, см. ошибку. См. этот ответ для другой возможности. - person Mikhail Shilkov; 21.06.2017

У меня пока нет репутации, чтобы комментировать, но в приведенном выше коде 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);
}
person Victor Pikula    schedule 29.05.2017
comment
iasyncollector не поддерживается для больших двоичных объектов - person Alex Gordon; 02.04.2019

Асинхронные методы могут нормально возвращать значения, но вы не должны возвращать чистый тип значения, вместо этого используйте 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;
    }
person Gabriel Schade Cardoso    schedule 03.11.2016
comment
Дох! Да, я хотел установить возвращаемое значение в Task‹string›. Функция из моего исходного ответа, вероятно, даже не сработает. Спасибо, сейчас исправил - person Zain Rizvi; 03.11.2016
comment
Не забывайте, что это также требует, чтобы вы установили для свойства name в вашем function.json значение $return для привязки вывода. Это говорит среде выполнения использовать вывод вашей функции в качестве источника. - person Tim P.; 04.02.2017