我正在编写一个非常简单的查询,它根据唯一的文档ID从集合中获取文档。在经历了一些挫折之后(我刚开始使用MongoDB和异步/等待编程模型),我弄清楚了这件事:
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;
事实证明,这也起作用,太棒了!
我相信我们有两种不同的方法来实现这些结果,肯定有重要的原因。这些方法之间有什么区别,为什么我应该选择其中一种?
async
关键字通过其调度程序“管理”您的代码,这可以但不总是使您的应用程序多线程化。await
关键字向编译器发出信号,以便在好的时机决定并切换上下文或利用新线程。 - whoisjasync
关键字并不会使你的应用程序多线程化。请参见此处。这不是关于 C# 的问题,而是有关 MongoDB C# API 中可用方法的差异。 - object88await
,那么“FindAsync”不能使你的应用程序多线程运行?如果你不立即await
,有很大的可能会实现多线程。 - John Saundersasync
和await
不会创建后台线程,也不会使线程休眠。async
和await
的整个意图是放弃对线程的控制,以便消息循环可以在同一线程上处理另一个排队的消息。如果您等待的内容本身没有在另一个线程上运行或自动执行后台请求,则添加await
不会导致它运行在另一个线程上。一个不适合使用await
的反例是计算密集型函数。 - object88