如何使用输出参数实现Azure异步功能

时间:2019-01-25 08:56:43

标签: c# azure azure-functions azure-cosmosdb azure-blob-storage

我实现了Azure功能。

我有另一种情况:

  1. 当某些内容上传到blob时(输入Blob是触发器)
  2. 过程逻辑
  3. 保存一些内容以输出blob(作为返回值输出)
  4. 将其他内容保存到dynamo数据库集合(输出参数)
  5. 将其他内容保存到另一个dynamo数据库集合(输出参数)

    [FunctionName("myFunction")]
    [return: Blob("images-text-out/{name}.txt")]
    public static string Run([BlobTrigger("samples-workitems/{name}", Connection = "StorageConnection")]Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob myBlob,
         string name,
         string blobTrigger,
         [CosmosDB(
            databaseName: "my-db-cosmos",
            collectionName: "CollectionA",
            ConnectionStringSetting = "CosmosDBConnection")] out dynamic processedFirst,
         [CosmosDB(
            databaseName: "my-db-cosmos",
            collectionName: "CollectionB",
            ConnectionStringSetting = "CosmosDBConnection")] out dynamic processedSecond,
         ILogger log,
         ExecutionContext context)
    {
        // . . .
        myBlob.DownloadToStreamAsync(memoryStream).Wait();
        // . . .
    }
    

这很好。问题只是我不能利用异步调用的优势。很清楚为什么,因为带有输出参数的方法不能是异步方法。

如何利用异步调用的优势实现具有多个输出的Azure函数?

谢谢

1 个答案:

答案 0 :(得分:4)

我们可以在异步方法中使用IAsyncCollector

  

仅当成功执行函数总是导致返回值传递到输出绑定时,才使用返回值。否则,请使用ICollector或IAsyncCollector

例如,将out dynamic processedSecond更改为IAsyncCollector<dynamic> processedFirst,然后再使用await processedFirst.AddAsync(someObject);

请参见CosmosDB output的示例。