C#遍历Azure Blob容器执行GetBlobsAsync后无打印输出问题
问题原因
无输出的核心原因有两类:
- 必现主因:控制台程序入口未等待异步任务执行完毕。你的
Main方法仅调用IterateBlobsAsync()获取了Task对象,但未对该任务做等待处理,主线程启动异步流程后会直接走完生命周期退出程序,后续的Blob查询、控制台打印逻辑根本来不及执行。 - 配置类排查项:修复等待逻辑后仍无输出时,依次核对以下配置:
- 填写的存储账户连接字符串是否正确,本地网络是否可以正常访问Azure存储服务
- 填写的容器名称是否和实际容器名完全一致(Azure存储容器名全小写,注意拼写)
- 连接字符串对应的访问凭据是否有目标容器的Blob读取权限
- 目标容器内是否确实存在Blob资源,空容器遍历不会返回任何结果
修复方法
将控制台入口改为可等待异步任务的写法,确保程序在异步逻辑执行完成前不会退出。C# 7.1及以上版本直接支持async Task Main写法,修复后完整代码如下:
using System; using System.Collections.Generic; using System.Threading.Tasks; using Azure; using Azure.Storage.Blobs; using Azure.Storage.Blobs.Models; using System.Linq; namespace IterateBlobs { class Program { static async Task Main(string[] args) { await IterateBlobsAsync(); Console.WriteLine("遍历执行完成,按任意键退出"); Console.ReadKey(); } private static async Task IterateBlobsAsync() { // 替换为真实存储账户连接字符串 string connect = "你的存储账户连接字符串"; BlobServiceClient sourceClient = new BlobServiceClient(connect); // 替换为真实容器名称 BlobContainerClient blobContainer = sourceClient.GetBlobContainerClient("你的容器名称"); List<BlobItem> segment = await blobContainer.GetBlobsAsync().ToListAsync(); foreach (BlobItem blobItem in segment) { Console.WriteLine($"Blob名称:{blobItem.Name}"); BlobClient blob = blobContainer.GetBlobClient(blobItem.Name); Response<BlobProperties> propertiesResponse = await blob.GetPropertiesAsync(); BlobProperties properties = propertiesResponse.Value; // 按需读取Blob属性,比如内容长度、类型等 } } } }
如果你使用的C#版本低于7.1,不支持异步Main写法,可以把Main方法内的代码替换为
IterateBlobsAsync().GetAwaiter().GetResult();来同步等待异步任务执行完成,不推荐直接使用Wait()方法,避免异常被AggregateException包装增加排查成本。
内容的提问来源于stack exchange,提问作者Janet
相关产品推荐
相关产品推荐

