异步读取JSON文件插入MongoDB集合无报错但集合为空排查
嘿,我一眼就看到你代码里的关键问题了!你这个异步插入MongoDB的方法没生效,核心原因是async void的误用,这可是异步编程里的常见坑,我来给你一步步拆解和修复:
核心问题:
async void 是异步方法的大忌 你把方法定义成了 public async void InsertDocumentsInCollection(string File),但除了UI事件处理程序这类特殊场景,绝对不要在普通异步方法里用async void!它会导致两个致命问题:
- 调用这个方法的代码根本没法等待它执行完成——可能你的程序在异步插入数据的操作还没结束时,就已经退出了,自然看不到数据
- 异步方法里抛出的异常会直接被吞掉(或者导致进程崩溃),这就是你调试时没看到报错的原因
解决方法很简单:把返回类型改成 Task,这样调用方可以用await等待它执行完毕:
public async Task InsertDocumentsInCollection(string file)
其他需要优化的细节(避免隐形问题)
- 同步读文件阻塞线程,换成异步版本
你用的File.ReadAllText()是同步方法,在异步方法里会阻塞线程,应该换成异步读文件的API:
string text = await System.IO.File.ReadAllTextAsync(file);
(顺便提一句:参数名File改成小写file更符合C#的命名规范哦)
- 加个数据验证,确认反序列化没出问题
有时候JSON文件是空的或者格式不对,但反序列化不会报错,导致你插入空集合。可以加个验证步骤:
var bsonArray = BsonSerializer.Deserialize<BsonArray>(text); if (!bsonArray.Any()) { throw new InvalidOperationException("JSON文件里没有可插入的文档哦!"); } IEnumerable<BsonDocument> docs = bsonArray.Select(p => p.AsBsonDocument);
- 确认数据库实例是有效的
虽然没报错,但最好确认_database是不是正确初始化的——比如连接字符串有没有写错,目标数据库是否存在。可以加个简单的验证输出:
var collection = _database.GetCollection<BsonDocument>("Cars"); Console.WriteLine($"当前操作的集合:{collection.CollectionNamespace.CollectionName}");
修改后的完整可运行代码
public async Task InsertDocumentsInCollection(string file) { // 异步读取JSON文件内容 string text = await System.IO.File.ReadAllTextAsync(file); // 反序列化并验证数据存在 var bsonArray = BsonSerializer.Deserialize<BsonArray>(text); if (!bsonArray.Any()) { throw new InvalidOperationException("JSON文件中没有可插入的文档"); } IEnumerable<BsonDocument> docs = bsonArray.Select(p => p.AsBsonDocument); // 获取目标集合并批量插入 var collection = _database.GetCollection<BsonDocument>("Cars"); await collection.InsertManyAsync(docs); // 可选:打印插入计数,确认操作成功 Console.WriteLine($"成功插入 {docs.Count()} 条文档到Cars集合"); }
调用时一定要记得用await!
最后提醒你:调用这个方法的时候,必须用await等待它完成,不然还是会出现没插入就结束的问题。比如在控制台程序里:
static async Task Main(string[] args) { // 先初始化MongoDB客户端和数据库实例 var mongoClient = new MongoClient("你的MongoDB连接字符串"); var database = mongoClient.GetDatabase("你的数据库名称"); // 调用你的插入方法 var yourService = new YourServiceClass(database); await yourService.InsertDocumentsInCollection("path/to/your/cars.json"); }
内容的提问来源于stack exchange,提问作者TropicalViking
相关产品推荐
相关产品推荐

