【发布时间】:2015-08-19 11:18:10
【问题描述】:
我正在编写一个非常非常简单的查询,它只是根据其唯一 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;
效果很好,太好了!但我不断看到对“查找”方法的引用,我解决了这个问题:
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关键字向编译器发出信号以决定和切换上下文或利用新线程。 -
async特别不使您的应用程序成为多线程的。见here。这不是关于 C# 的问题,而是 MongoDB C# API 可用方法的差异。 -
FindAsync不会让您的应用程序多线程是什么意思?如果您不立即await,它很有可能会这样做。 -
不,如果您阅读我发布的链接,您会发现使用
async和await将明确不创建线程。它不会创建后台线程,也不会使线程进入睡眠状态。async和await的全部意义在于放弃对线程的控制,以便消息循环可以在同一线程上处理另一个排队的消息。如果你是awaiting 本身并没有在另一个线程上运行或本质上执行后台请求,添加await不会导致它。使用await的反例是一个CPU绑定函数。
标签: c# mongodb mongodb-query mongodb-csharp-2.0