MongoDB C#Driver 2.0和ForEachAsync

时间:2015-08-11 16:39:31

标签: c# mongodb

我对C#中的异步并不是很熟悉,但我想更好地理解它。我正在尝试处理Mongo中的文档列表,我不确定我是否有竞争条件,或者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驱动程序执行同步。

有人可以告诉我如何构建上述代码,或者如果我错了,为什么它不是竞争条件?

谢谢。

1 个答案:

答案 0 :(得分:1)

根据这个:

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

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

所以Find()返回一个异步游标,它一次只指向一个文档。文档没有明确说明ForEachAsync()移动光标位置直到你的lambda完成之后,但这可能是它的工作原理(否则,光标的点被击败)因为你一次将多个记录加载到内存中。)

因此,你应该安全地做你自己,并且不应该遇到竞争条件。