Find 和 FindAsync 之间的区别

Difference between Find and FindAsync

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

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

成功了,太棒了!但我一直看到对 "Find" 方法的引用,我解决了这个问题:

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

事实证明,这也行,太棒了!

我确信我们有两种不同的方法来实现这些结果是有一些重要原因的。这些方法之间有什么区别,为什么我应该选择其中一种?

假设您在 Web 请求中执行此代码,通过调用 find 方法请求的线程将被冻结,直到数据库 return 结果它是一个同步调用,如果它是一个需要花费很长时间的数据库操作秒完成,您将有一个线程可用于服务 Web 请求,什么都不做,只是等待该数据库 return 结果,并浪费宝贵的资源(线程池中的线程数是有限的)。

使用 FindAsync,您的 Web 请求线程在等待数据库 return 结果时将空闲,这意味着在数据库调用期间,该线程可以空闲以参加另一个 Web 请求。当数据库 returns 的结果然后代码继续执行。

对于像 read/writes 文件系统、数据库操作、与其他服务通信这样的长时间操作,使用异步调用是个好主意。因为当您等待结果时,线程可用于处理另一个 Web 请求。这更具可扩展性。

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

区别在于语法。 FindFindAsync 都允许构建具有相同性能的异步查询,只有

FindAsync returns 游标 不会一次加载所有文档 并为您提供界面从数据库游标中一个接一个地检索文档。这在查询结果很大的情况下很有用。

Find 通过方法 ToListAsync 为您提供 更简单的语法 ,它在其中从游标和 returns 检索文档一次所有文档