You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BlobClient.OpenWriteAsync生成多BlobCreated事件的原因及解决办法

Azure Function监听BlobCreated时,OpenWriteAsync触发多事件的原因与解决办法

问题原因

两种写入Blob的方式在Azure Blob存储服务端的执行逻辑存在差异,导致事件触发次数不同:

  • UploadAsync采用原子性一次性上传:将整个流的内容一次性提交给服务端,服务端完成Blob创建/覆盖后仅触发1次BlobCreated事件。
  • OpenWriteAsync+StreamWriter是分阶段流式写入,流程如下:
    • 调用OpenWriteAsync(overwrite: true)时,服务端先创建空占位Blob(或覆盖现有Blob为空),触发第1次BlobCreated事件;
    • StreamWriter写入内容时,因内部缓冲区机制会分批次上传数据,每完成一次数据提交就会触发额外的BlobCreated事件;
    • 流释放(using块结束)时,服务端完成最终Blob数据提交,触发第3次BlobCreated事件。

解决办法

要兼顾低内存占用和单次事件触发,推荐以下两种方案:

方案1:使用UploadAsync的字符串重载(最优)

无需手动创建MemoryStream,直接用BinaryData包装字符串上传,底层会高效处理流的内存占用,同时服务端执行原子性操作,仅触发1次事件:

await blobClient.UploadAsync(BinaryData.FromString(content), overwrite: true);

方案2:优化流式写入逻辑

如果必须使用流式写入,可通过调整缓冲区大小,让StreamWriter一次性提交所有内容,减少服务端分段操作:

var options = new BlobOpenWriteOptions 
{ 
    Overwrite = true, 
    BufferSize = content.Length + 1024 // 设置足够大的缓冲区,确保单次写入
};
using var stream = await blobClient.OpenWriteAsync(options, cancellationToken);
using var writer = new StreamWriter(stream, encoding, leaveOpen: false);
await writer.WriteAsync(content);
await writer.FlushAsync();

内容的提问来源于stack exchange,提问作者Magnus Gladh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 09:37:47