MongoDB C# Driver 2.0 and ForEachAsync

本文关键字:and ForEachAsync Driver MongoDB | 更新日期: 2023-09-27 18:07:24

我不是很熟悉c#中的async,但我正在努力更好地理解它。我试图在蒙古处理文档列表,我不确定我是否有一个竞争条件,或者如果异步是特殊的,导致这是好的。下面是我的例子。

var docs = new Dictionary<string, BsonDocument>();
var result = db.GetCollection<BsonDocument>("mycollection").Find(new BsonDocument());
result.ForEachAsync((bsonDoc) =>
{
    string name = bsonDoc.GetValue("name").AsString;
    if (!docs.ContainsKey(name))
    {
        docs[name] = bsonDoc;
    }
});

如果两个文档具有相同的名称,那么if语句可以为相同的名称执行两次。

我不确定为什么似乎没有一个直接的方法是用新的mongo驱动程序为每个人做同步。

有人能告诉我我应该如何结构上面的代码,或者为什么它不是一个竞争条件,如果我错了?

谢谢。

MongoDB C# Driver 2.0 and ForEachAsync

按此:

http://mongodb.github.io/mongo-csharp-driver/2.0/reference/driver/crud/reading/

使用空过滤器和Find方法查找集合中的所有文档。一旦有了一个游标(IAsyncCursor类型),就可以像手动迭代IEnumerable一样迭代它。

所以Find()返回一个异步游标,每次只指向一个文档。文档没有明确地说ForEachAsync()在lambda完成之前不会移动光标位置,但这大概就是它的工作方式(否则,游标点会失败,因为您一次将多条记录加载到内存中)。

因此,应该是安全的,不应该遇到竞争条件。