我对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驱动程序执行同步。
有人可以告诉我如何构建上述代码,或者如果我错了,为什么它不是竞争条件?
谢谢。
答案 0 :(得分:1)
根据这个:
http://mongodb.github.io/mongo-csharp-driver/2.0/reference/driver/crud/reading/
使用空过滤器和方法Find查找集合中的所有文档。一旦我们有了一个游标(类型为IAsyncCursor),我们可以像手动迭代IEnumerable一样迭代它。
所以Find()
返回一个异步游标,它一次只指向一个文档。文档没有明确说明ForEachAsync()
移动光标位置直到你的lambda完成之后,但这可能是它的工作原理(否则,光标的点被击败)因为你一次将多个记录加载到内存中。)
因此,你应该安全地做你自己,并且不应该遇到竞争条件。