Find和FindAsync之间的区别

我正在编写一个非常非常简单的查询,它根据其唯一ID从集合中获取文档。 经过一些frusteration(我是mongo和async / await编程模型的新手)后,我想出了这个:

IMongoCollection collection = // ... FindOptions options = new FindOptions { Limit = 1 }; IAsyncCursor task = await collection.FindAsync(x => x.Id.Equals(id), options); List list = await task.ToListAsync(); TModel result = list.FirstOrDefault(); return result; 

它很棒! 但我一直看到对“查找”方法的引用,我解决了这个问题:

 IMongoCollection collection = // ... IFindFluent findFluent = collection.Find(x => x.Id == id); findFluent = findFluent.Limit(1); TModel result = await findFluent.FirstOrDefaultAsync(); return result; 

事实certificate,这也很有效,太棒了!

我确信我们有两种不同的方法可以实现这些结果。 这些方法有什么区别,为什么我要选择其中一种呢?

区别在于语法。 FindFindAsync都允许仅以相同的性能构建异步查询

FindAsync返回一次不加载所有文档的 游标 ,并提供从DB游标逐个检索文档的界面。 当查询结果很大时,它很有用。

Find通过方法ToListAsync为您提供更简单的语法 ,它在里面从光标检索文档并一次返回所有文档

想象一下,你在web请求中执行这段代码,通过调用find方法,请求的线程将被冻结,直到数据库返回结果它是一个同步调用,如果它是一个需要几秒钟才能完成的长数据库操作,你将拥有一个可用于提供Web请求的线程只是等待该数据库返回结果,并浪费宝贵的资源(线程池中的线程数量有限)。

使用FindAsync,在等待数据库返回结果时,Web请求的线程将是空闲的,这意味着在数据库调用期间,此线程可以自由地参加另一个Web请求。 当数据库返回结果时,代码继续执行。

对于诸如从文件系统读取/写入,数据库操作等长时间操作,与其他服务通信,使用异步调用是个好主意。 因为在等待结果时,线程可用于提供另一个Web请求。 这更具可扩展性。

看一下这篇微软文章https://msdn.microsoft.com/en-us/magazine/dn802603.aspx 。