How can I bind output values to my async Azure Fun

2019-01-18 22:33发布

How can I bind my outputs to an async function? The usual method of setting the parameter to out doesn't work with async functions.

Example

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

This results in a compilation Error:

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

Binding used (fyi)

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

3条回答
爷的心禁止访问
2楼-- · 2019-01-18 22:56

There are a couple ways to do this:

Bind the output to the function's return value (Easiest)

Then you can simply return the value from your function. You'll have to set the output binding's name to $return in order to use this method

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

Binding

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

Bind the output to IAsyncCollector

Bind the output to IAsyncCollector and add your item to the collector.

You'll want to use this method when you have more than one output bindings.

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

Binding

{
  "bindings": [
    {
      "type": "blob",
      "name": "collection",
      "path": "testoutput/{rand-guid}.txt",
      "connection": "AzureWebJobsDashboard",
      "direction": "out"
    },
    {
      "type": "manualTrigger",
      "name": "input",
      "direction": "in"
    }
  ],
  "disabled": false
}
查看更多
太酷不给撩
3楼-- · 2019-01-18 23:08

I do not have the reputation yet to be able to make a comment, but in Zain Rizvi's code above, it should say 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);
}
查看更多
来,给爷笑一个
4楼-- · 2019-01-18 23:12

Async methods can return values normally, but you shouldn't return the pure type of value, use Task instead, like this:

 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;
    }
查看更多
登录 后发表回答