Azure 函数:ICollector<T> 与 IAsyncCollector<T>

Posted

技术标签:

【中文标题】Azure 函数:ICollector<T> 与 IAsyncCollector<T>【英文标题】:Azure Functions: ICollector<T> vs IAsyncCollector<T> 【发布时间】:2017-04-05 14:07:34 【问题描述】:

在编写 C# 函数(也适用于 WebJobs)时,Azure Functions 中的 ICollector&lt;T&gt;IAsyncCollector&lt;T&gt; 有什么区别?

我从示例中了解到,这些接口是我可以用来将函数参数绑定到输出绑定的接口。我也了解这两个接口相应地具有非异步和异步方法签名(即ICollector&lt;T&gt;.Add(item)IAsyncCollector&lt;T&gt;.AddAsync(item))。但他们在幕后做了什么?他们是否真的将数据发布到输出绑定,还是在函数执行结束时在内部缓冲和刷新(在这种情况下,为什么要通过AddAsync 方法)?

【问题讨论】:

【参考方案1】:

ICollector&lt;T&gt;.Add(item) 将始终立即对底层服务执行添加操作。例如。 Queue 绑定的实现将在添加消息时立即将它们排入队列。

IAsyncCollector&lt;T&gt;.AddAsync(item) 行为因绑定而异,具体取决于底层服务是否支持批处理。在这种情况下,AddAsync 可能只会通过相应的IAsyncCollector&lt;T&gt;.FlushAsync 方法实际保存添加的项目以稍后刷新。当函数成功完成时,FlushAsync 将被自动调用。您可以允许自动刷新行为为您刷新,或者您可以根据需要选择在您的函数中手动调用FlushAsync

批处理可以让绑定以最有效的方式与底层服务交互。例如。对于 Azure 表,可以在单个批处理操作中更新/保留多个实体。

【讨论】:

除了看起来大多数绑定不支持批处理(请参阅github.com/Azure/azure-webjobs-sdk/issues/921)。例如,ServiceBus 不批处理!

以上是关于Azure 函数:ICollector<T> 与 IAsyncCollector<T>的主要内容,如果未能解决你的问题,请参考以下文章

如何在 t-sql (Azure Synapse) 的 CAST/CONVERT 中使用字符串函数

如何在 Azure 表存储中使用 partitionkey 加快查询速度

从 project.json 到 function.proj xml 的 Azure 函数转换

Azure Function App HTTP 触发来自请求正文的 CosmosDB 输入查询

即使出现错误,Azure APIM 也会调用函数

Azure Functions 运行时 2 - 使用 SqlClient 的 SQL 连接